Tag: 优化

有人知道为低内存使用而优化的java.util.Map实现吗?

我看过通常的地方(apache commons,google)而找不到… 它应该是开源的。 几乎找到一个基于链表的。 用例是10’000的地图,不一定有很多值。它不需要按比例放大,因为当它变得太大时我可以转换它。 一些数字,大小使用一些计算的jvm值(8bytes / java.lang.Object,4bytes / ref)HashMap大约是100 + 32n字节,理论上最好的是12 + 20 * n。 < – 我想要那个,小n。

返回ArrayList或List?

我正在创建一个供人们使用的库,但为什么我的方法应该返回List而不是ArrayList ? 因为如果用户知道真实类型是ArrayList,他将在循环中使用accessor []而不是迭代器,但如果他不知道他将使用迭代器。 对于LinkedList的相同问题,如果返回类型是List,则他将无法使用正确的访问者。 我对吗?

增加核心数时降低性能

我的mac配备了16个核心。 System.out.println(Runtime.getRuntime().availableProcessors()); //16 我正在运行下面的代码,以了解使用我的核心的有效性。 线程’CountFileLineThread’只计算文件中的行数(文件夹中有133个文件) 我在这条线上做笔记: ExecutorService es = Executors.newFixedThreadPool(NUM_CORES); NUM_CORES在1到16之间。 您将从下面的结果中注意到,5个以上内核的性能开始下降。 我不希望6芯及以上的产品“收益递减”(btw,7芯需要超过22分钟,你好?!?!)我的问题是为什么? public class TestCores { public static void main(String args[]) throws Exception { long start = System.currentTimeMillis(); System.out.println(“START”); int NUM_CORES = 1; List files = Util.getFiles(“/Users/adhg/Desktop/DEST/”); System.out.println(“total files: “+files.size()); ExecutorService es = Executors.newFixedThreadPool(NUM_CORES); List<Future> futures = new ArrayList<Future>(); for (File file : files) […]

优化Java对象以提高CPU缓存行的效率

我正在写一个库,其中: 它需要在各种不同的平台 / Java实现上运行(常见的情况可能是使用Windows或Linux的Intel 64位计算机上的OpenJDK或Oracle Java) 实现高性能是一个优先事项 ,因为我关心对象访问中的CPU缓存行效率 在某些区域,将遍历/处理相当大的小对象图形 (假设大约1GB) 主要工作量几乎完全是读取 读取将分散在对象图中,但不是完全随机的(即,将存在重要的热点,偶尔读取到不常访问的区域) 多个线程将同时访问 (但不修改)对象图。 没有锁定,假设不会发生并发修改。 设计小对象是否有一些经验法则/指南,以便在这种环境中有效利用CPU缓存线? 我对正确调整和构造对象特别感兴趣,因此例如最常访问的字段适合第一个缓存行等。 注意:我完全清楚这是依赖于实现的,我需要进行基准测试,以及过早优化的一般风险。 无需浪费任何进一步的带宽指出这一点。 🙂

为什么String.equals()比自身更快?

我试图创建一个更快版本的String.equals()方法,并通过简单地复制它开始。 我发现的结果非常令人困惑。 当我运行复制粘贴版本,定时并将其与JVM版本进行比较时,JVM版本更快。 差异从6倍到34倍不等! 简单地说,弦越长,差异就越大。 boolean equals(final char a[], final char b[]) { int n = a.length; int i = 0; while (n– != 0) { if (a[i] != b[i]) return false; i++; } return true; } public static void main() throws Exception { String a = “blah balh balh”; String b = “blah balh […]

优化Jaro-Winkler算法

我从这个网站获取了Jaro-Winkler算法的代码。 我需要运行150,000次以获得差异之间的距离。 这需要很长时间,因为我在Android移动设备上运行。 它可以更优化吗? public class Jaro { /** * gets the similarity of the two strings using Jaro distance. * * @param string1 the first input string * @param string2 the second input string * @return a value between 0-1 of the similarity */ public float getSimilarity(final String string1, final String string2) { //get […]

如何使用6 * k + – 1规则生成Primes

我们知道可以使用以下方法生成3以上的所有素数: 6 * k + 1 6 * k – 1 然而,我们从上面的公式生成的所有数字都不是素数。 For Example: 6 * 6 – 1 = 35 which is clearly divisible by 5. 为了消除这些条件,我使用Sieve方法并删除了数字,这些数字是从上面公式生成的数字的因子。 使用事实: 如果一个数字没有素数因素,那么它就是素数。 因为我们可以使用上面的公式生成所有素数。 如果我们可以删除上述数字的所有倍数,我们只剩下素数。 生成低于1000的素数。 ArrayList primes = new ArrayList(); primes.add(2);//explicitly add primes.add(3);//2 and 3 int n = 1000; for (int i = 1; i <= (n […]

更快实现总和(用于Codility测试)

以下简单的sum实现如何更快? private long sum( int [] a, int begin, int end ) { if( a == null ) { return 0; } long r = 0; for( int i = begin ; i < end ; i++ ) { r+= a[i]; } return r; } 编辑 背景是有序的。 阅读关于编码恐怖的最新条目,我来到这个网站: http : //codility.com ,它有这个有趣的编程测试。 无论如何,我在提交中得到60分中的60分,基本上(我认为)是因为这个实现总和,因为那些我失败的部分是性能部分。 我得到TIME_OUT_ERROR了 所以,我想知道算法中的优化是否可行。 […]

在Java中使用“sincos”

在很多情况下,我不仅需要正弦,还需要相同参数的余弦。 对于C,在常见的unix m数学库中有sincos函数。 实际上,至少在i386上,这应该是单个汇编指令fsincos 。 sincos,sincosf,sincosl – 同时计算sin和cos 我想这些好处是存在的,因为在计算正弦和余弦时存在明显的重叠: sin(x)^2 + cos(x)^2 = 1 。 但是AFAIK尝试将其cos = Math.sqrt(1 – sin*sin)为cos = Math.sqrt(1 – sin*sin)并没有得到回报,因为sqrt函数的成本相似。 有没有办法在Java中获得相同的好处? 我想我要为double[]付出代价; 由于添加了垃圾收集,这可能使所有的努力都没有实际意义。 或者Hotspot编译器是否足够智能以识别我需要两者,并将其编译为sincos命令? 我可以测试它是否识别它,我可以帮助它识别这一点,例如确保Math.sin和Math.cos命令在我的代码中直接连续吗? 从Java语言的角度来看,这实际上是最有意义的:让编译器优化它以使用fsincos汇编调用。 从一些汇编文档中收集: Variations 8087 287 387 486 Pentium fsin – – 122-771 257-354 16-126 NP fsincos – – 194-809 292-365 17-137 NP Additional cycles required if […]

拥有许多小方法是否有助于JIT编译器进行优化?

在最近关于如何优化某些代码的讨论中,我被告知将代码分解为许多小方法可以显着提高性能,因为JIT编译器不喜欢优化大型方法。 我不确定这一点,因为看起来JIT编译器本身应该能够识别自包含的代码段,而不管它们是否在自己的方法中。 任何人都可以确认或反驳这种说法吗?