Tag: 性能

调整XORShift发生器以返回最大值

我需要在最大值内生成随机整数。 由于性能至关重要 ,我决定使用XORShift生成器而不是Java的Random类。 long seed = System.nanoTime(); seed ^= (seed <>> 35); seed ^= (seed << 4); 这个实现(源代码)给了我一个长整数,但我真正想要的是一个介于0和最大值之间的整数。 public int random(int max){ /*…*/} 实现此方法的最有效方法是什么?

禁用时Java断言的性能拖累

代码可以使用其中的断言进行编译,并且可以在需要时激活/取消激活 。 但是,如果我部署一个带有断言的应用程序并且那些被禁用,那么在那里被忽略的惩罚是什么?

如何规范记录指令产生的打印输出量随着时间的推移而产生?

如何在Y秒内将程序日志打印输出限制为最多X个打印输出? 使用java.util.logging编程服务器端,我的代码有很多信息,警告和错误语句,如: s_logger.logp(Level.WARNING, myClassName, myMethodName, “msg.code.in.properties.file”); 一方面,我确实希望看到上面的警告信息打印到STDOUT,因为它表明出现了问题,特别是在调查生产中的问题时,但另一方面,打印了许多讲述相同故事的线条在很短的时间内,没有附加价值,而是打击性能并引入滚动失明。 我正在寻找的是一种机制/ API,可以在y秒内将每个消息代码的打印输出调整为不超过x条消息。 例如,在一分钟内,我不想生成和写入超过10个类型的消息:“事务超时”。 我很高兴API或库参考,任​​何人?

Java 8中的legacy for循环,流和parallelStream之间的比较

import java.util.ArrayList; import java.util.List; public class IterationBenchmark { public static void main(String args[]){ List persons = new ArrayList(); persons.add(“AAA”); persons.add(“BBB”); persons.add(“CCC”); persons.add(“DDD”); long timeMillis = System.currentTimeMillis(); for(String person : persons) System.out.println(person); System.out.println(“Time taken for legacy for loop : “+ (System.currentTimeMillis() – timeMillis)); timeMillis = System.currentTimeMillis(); persons.stream().forEach(System.out::println); System.out.println(“Time taken for sequence stream : “+ (System.currentTimeMillis() – […]

Javamail性能

我一直在使用javamail从IMAP服务器(目前是GMail)检索邮件。 Javamail非常快速地从服务器检索特定文件夹中的消息列表(仅ID),但是当我实际获取消息(仅包含信息甚至不包含内容)时,每条消息大约需要1到2秒。 应该使用哪些技术进行快速检索? 这是我的代码: try { IMAPStore store = null; if(store!=null&&store.isConnected())return; Properties props = System.getProperties(); Session sessionIMAP = Session.getInstance(props, null); try { store = (IMAPStore) sessionIMAP.getStore(“imaps”); store.connect(“imap.gmail.com”,993,”username@gmail.com”,”password”); } catch (Exception e) { e.printStackTrace(); } IMAPFolder folder = (IMAPFolder) store.getFolder(“INBOX”); folder.open(Folder.READ_ONLY); System.out.println(“start”); Message[] msgs = folder.getMessages(1,10); long ftime = System.currentTimeMillis(); FetchProfile fp=new FetchProfile(); fp.add(FetchProfile.Item.ENVELOPE); folder.fetch(msgs, fp); […]

Hibernate比sql查询慢1000倍

我有这个设置 @Table(name =”A”) EntityA { Long ID; List children; } @Table(name =”B”) EntityB { Long ID; EntityA parent; EntityC grandchild; } @Table(name =”C”) EntityC { Long ID; } SQL查询就是这个(我省略了不相关的细节): select top 300 from A where … and ID in (select parent from B where … and grandchild in (select ID from C where …)) order […]

一种有效的算法,以恒定的速度沿着一条线移动鸵鸟

问题:在笛卡尔坐标系中以恒定速度沿直线移动对象(仅限x,y)。 更新率不稳定。 移动速度必须接近精确,物体必须非常靠近目的地。 该行的来源和目的地可能在任何地方。 给定:源地址和目标地址(x0,x1,y0,y1)和任意值的速度。 一个助手:关于这一点,SO有一个答案,这很好,但是它假设花费了总的旅行时间。 这是我得到的: x0 = 127; y0 = 127; x1 = 257; y1 = 188; speed = 127; ostrich.x=x0 //plus some distance along the line; ostrich.y=y0 // plus some distance along the line; //An arbitrarily large value so that each iteration increments the distance a minute amount SPEED_VAR = 1000; xDistPerIteration […]

比较器工作方式的效率

我试图使用比较器来帮助排序对象列表。 我有一个问题,关于比较器的确切工作原理以及它在以下示例中的作用: private static Comparator comparator() { return (Student a, Student b) -> { return Integer.compare(complexOperation(a), complexOperation(b)); } } 如您所见,需要根据complexOperation()方法返回的整数等级对学生进行比较和排序。 顾名思义,这是一项繁重的操作。 上述方法是否最有效? 或者,最好是按照我要排序的列表中的每个学生进行操作,对每个学生执行complexOperation()并将结果存储在Student对象的字段中。 然后比较器会做一个: Integer.compare(a.getRank(), b.getRank()) 这两种方法是否具有可比性,或者由于比较器的工作方式(可能比较同一个对象不止一次,因此在比较期间每个学生多次运行complexOperation()),是否可以更快地进行预计算complexOperation()会导致学生领域? 以上将被称为如下: Collections.sort(students, comparator()); 希望很清楚! 编辑:让我们说,为了它,不可能在Student对象中添加一个字段(对于一个更复杂的情况,这是一个玩具问题,我无法自由修改Student对象)。 是否仍然可以更好地创建一个自定义对象,其中学生坐在里面添加另一个字段而不是在比较器中执行complexOperation()? 或者还有另一种解决问题的方法吗? 我可以考虑创建一个Hashmap,它将student id作为键,complexOperation()的结果作为值,只是在比较器中创建/访问该记录?

Java:处理大数据量的建议。 (部分Deux)

好的。 所以我有大量的二进制数据(比方说,10GB)分布在不同长度的一堆文件(比方说5000)上。 我正在编写一个Java应用程序来处理这些数据,我希望为数据访问建立一个好的设计。 通常情况会是这样的: 无论如何,在处理过程中将读取所有数据。 每个文件(通常)按顺序读取,一次只需几千字节。 但是,通常需要同时具有每个文件的前几千字节,或者同时具有每个文件的中间几千字节等。 有些时候,应用程序需要随机访问一个或两个字节。 目前我使用RandomAccessFile类读取字节缓冲区(和ByteBuffers)。 我的最终目标是将数据访问封装到某个类中,以便它很快,我再也不用担心它了。 基本function是我将要求它从指定文件中读取dataframe,并且我希望在上述考虑因素的情况下最小化I / O操作。 典型访问的示例: 给我所有文件的前10千字节! 给我文件F的字节0到999,然后给我字节1到1000,然后给我2到1001等等,… 从文件F开始给我一兆字节的数据,从这样的字节开始! 对优秀设计的任何建议?

如何在Perl中设置文件读取缓冲区大小以针对大型文件进行优化?

据我所知,Java和Perl在读取文件时很难找到一个适合所有默认缓冲区大小的内容,但我发现他们的选择越来越过时,并且在更改默认选择时遇到问题Perl的。 在Perl的情况下,我认为默认情况下使用8K缓冲区,类似于Java的选择,我找不到使用perldoc网站搜索引擎(真的谷歌)的参考如何增加默认文件输入缓冲区大小, 64K。 从上面的链接,以显示8K缓冲区如何不缩放: 如果行通常每个约有60个字符,则10,000行文件中包含大约610,000个字符。 使用缓冲逐行读取文件只需要75次系统调用和75次磁盘等待,而不是10,001次。 因此,对于每行60个字符(包括末尾的换行符)的50,000,000行文件,使用8K缓冲区,它将进行366211次系统调用以读取2.8GiB文件。 顺便说一句,您可以通过在任务管理器进程列表中查看磁盘i / o读取增量(在Windows中至少,在* nix中显示同样的东西,我确定)作为您的Perl程序来确认此行为在文本文件中读取需要10分钟:) 有人问过关于在perlmonks上增加Perl输入缓冲区大小的问题,有人回答说你可以增加“$ /”的大小,从而增加缓冲区大小,但是从perldoc: 将$ /设置为对整数的引用,包含整数的标量或可转换为整数的标量将尝试读取记录而不是行,最大记录大小为引用的整数。 所以我假设这实际上并没有增加Perl在使用典型时从磁盘读取的缓冲区大小: while() { #do something with $_ here … } “逐行”成语。 现在它可能是一个不同的“一次读取一条记录,然后将其解析成行”,上述代码的版本通常会更快,并且绕过标准习惯用语的底层问题而无法更改默认缓冲区大小(如果确实不可能),因为您可以将“记录大小”设置为您想要的任何内容,然后将每条记录解析为单独的行,并希望 Perl做正确的事情并最终为每条记录执行一次系统调用,但它增加复杂性,我真正想做的就是通过将上面示例中使用的缓冲区增加到相当大的大小(例如64K),甚至将缓冲区大小调整到最佳大小以便使用测试进行长读取来获得轻松的性能提升我的系统上的脚本,无需额外的麻烦。 对于增加缓冲区大小的直接支持,Java中的情况要好得多。 在Java中,我相信java.io.BufferedReader使用的当前默认缓冲区大小也是8192字节,尽管JDK文档中的最新引用是模棱两可的,例如,1.5文档仅说: 可以指定缓冲区大小,或者可以接受默认大小。 对于大多数用途,默认值足够大。 幸运的是,您不必相信JDK开发人员可以为您的应用程序做出正确的决定,并且可以设置自己的缓冲区大小(在此示例中为64K): import java.io.BufferedReader; […] reader = new BufferedReader(new InputStreamReader(fileInputStream, “UTF-8”), 65536); […] while (true) { String line = reader.readLine(); if (line == null) […]