Tag: 基准测试

基准C ++与Java,不切实际的结果

我做了一个简单的测试,我知道C ++更快但我的测试结果不切实际。 C ++代码是: #include #include unsigned long long s(unsigned long long n) { unsigned long long s = 0; for (unsigned long long i = 0; i < n; i++) s += i; return s; } int main() { LARGE_INTEGER freq, start, end; QueryPerformanceFrequency(&freq); QueryPerformanceCounter(&start); printf("%llu\n", s(1000000000)); QueryPerformanceCounter(&end); double d = (double) (end.QuadPart – […]

基准测试:同一过程多次,只有一次预热?

我目前正在开发一个Java应用程序(Benchmark),其目的是确定某些与数据库相关的进程。 我的应用程序应运行如下: 我有多个Usecases(简单插入,简单更新等,在数据库中),我想多次运行。 运行之间的唯一区别是同时运行的线程数。 我需要使用1,2,4,8,16等线程对这些用例进行测试,以便在我的测试中包含并发性(使用ExecutorService)。 我的问题 : 我的应用程序在每次运行之前是否需要运行预热? 或者只有一个就足够了。 换句话说,我的应用程序是否必须执行以下操作: –warmup –process(1) (1 thread) –warmup –process(2) (2 threads) etc. 要么 –warmup –process(1) –process(2) etc. 基本上,无论线程数如何,“process()”方法都完全相同。 我倾向于认为一个显然是足够的,因为JVM不会真正优化任何东西,因为代码不会改变。 但是,仍然,我更喜欢寻求一些exerimented建议:) 谢谢您的帮助 ! 注意:我读了很多关于基准测试的内容: http://www.ibm.com/developerworks/library/j-jtp12214/ http://www.ibm.com/developerworks/java/library/j-benchmark1/index.html http://www.ibm.com/developerworks/java/library/j-benchmark2/ 这就是为什么我会说只需要一次预热。 🙂

为什么IntStream.range(0,100000).parallel.foreach需要比循环更长的正常时间

我刚刚开始学习Java中的Streams和parallel,我想知道为什么正常for循环比在向数组添加项目时并行的IntStream花费更少的时间。 package parallel; import java.util.stream.IntStream; public class Parallel { public static void main(String[] args) { final int[] intArray = new int[100000]; long startTime = System.currentTimeMillis(); IntStream.range(0, 100000).parallel().forEach(i -> intArray[i]=i); long endTime = System.currentTimeMillis(); System.out.println(“Parallel time: ” + (endTime-startTime)); final int[] intArray2 = new int[100000]; try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated […]

这个Java代码如何加速?

我正在尝试对Java执行简单任务的速度进行基准测试:将大文件读入内存,然后对数据执行一些无意义的计算。 所有类型的优化都很重要。 无论是以不同方式重写代码还是使用不同的JVM,都会欺骗JIT。 输入文件是由逗号分隔的5亿个32位整数对列表。 喜欢这个: 44439,5023 33140,22257 … 这个文件在我的机器上需要5.5GB 。 该程序不能使用超过8GB的RAM,只能使用一个线程 。 package speedracer; import java.io.FileInputStream; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; public class Main { public static void main(String[] args) { int[] list = new int[1000000000]; long start1 = System.nanoTime(); parse(list); long end1 = System.nanoTime(); System.out.println(“Parsing took: ” + (end1 – start1) / 1000000000.0); int rs […]

在Java中需要多长时间? 用Java测量延迟时间

我不想更改此代码,我只对JVM,OS或内核定制/配置感兴趣以获得最佳结果! 我有一个第二个循环(1000 x 1ms) public static void main(String[] args) throws InterruptedException { long start = System.nanoTime(); for (int i = 0; i < 1000; i++ ) { Thread.sleep(TimeUnit.MILLISECONDS.toMillis(1)); } long duration = System.nanoTime() – start; System.out.println("Loop duration " + duration / TimeUnit.MILLISECONDS.toNanos(1) + " ms."); } 在我的带有内核3.12的Fedora 20上,这个循环需要1055毫秒。 这是相当不错的结果,平均超过1100ms 。 是否可以使用自定义JVM标志或操作系统配置使此代码更快? Loop duration 1055 ms.

为什么Method访问看起来比Field访问快?

我正在做一些测试,以找出使用getter / setter和直接字段访问之间的速度差异。 我写了一个简单的基准测试应用程序: public class FieldTest { private int value = 0; public void setValue(int value) { this.value = value; } public int getValue() { return this.value; } public static void doTest(int num) { FieldTest f = new FieldTest(); // test direct field access long start1 = System.nanoTime(); for (int i = 0; i […]

导致GC流失一致的技术

我正在寻找基准如何在与大量正在进行的垃圾收集竞争时执行的操作。 我之前已经对它在稳定的单线程运行中的行为进行了基准测试,现在我想在更加紧张的JVM中进行相同的测试; 本质上我想让背景线程以合理一致的速度创建和销毁对象。 我正在寻找有关如何实施稳定但GC密集型操作的建议。 它需要完成几个目标: 在GC中花费相当多的时间(比方说,20-50%) 随着时间的推移做大致一致的工作量,并为GC创建类似一致的工作量 避免泛滥堆并触发Java heap space错误 避免GC过载并触发GC overhead limit exceeded错误

Java for循环性能问题

考虑这个例子: public static void main(final String[] args) { final List myList = Arrays.asList(“A”, “B”, “C”, “D”); final long start = System.currentTimeMillis(); for (int i = 1000000; i > myList.size(); i–) { System.out.println(“Hello”); } final long stop = System.currentTimeMillis(); System.out.println(“Finish: ” + (stop – start)); } VS public static void main(final String[] args) { final List […]

JDK8 LocalDate.toEpochDay的性能下降奇怪

如果我们最终得到一个带JDK8的快速日期时间库,我很好奇。 几乎所有的LocalDate计算都使用toEpochDay所以我查看了源代码 ,大量的分支和分支让我好奇,如果我能做得更好的话。 我消除了一些分支和除了一个分区以外的所有分支,但是加速比预期更差。 所以我的第一个问题是如何使用多次除法的算法只需要大约30个周期(吞吐量)。 霍尔格的评论似乎已经回答了这个问题:一个小常数的除法得到了乘法的JIT编辑。 我是手动完成的,现在我一直在以原来的实施方式击败2倍。 基准测试非常简单,只需迭代一组随机的LocalDate并将它们转换为toEpochDay 。 尽管具有随机性,但结果非常一致。 数组的大小是一个参数,我的主要问题是2000到30000之间的大幅减速来自何处 。 应该会有一些减速,因为数据不再适合L1缓存,但两种算法的内存访问完全相同(即,没有,但从数组中获取date )。 仍然存在的问题是: 如何在迭代数组时,同一函数的两个简单的无内存访问实现的行为会发生变化? 原始算法的速度比我的慢得多。 我的算法在这里可能不值得复制,它没有文档记录,与原版一样神秘,而且只有一个非常基本的测试 。

获取Java中的CPU线程使用情况

我有一个关于获得给定JNI块的CPU利用率的问题。 我在底层的C ++ JNI本机方法中进行了一些密集的CPU计算。 我正在优化这个计算,并希望根据不同的输入进行基准测试。 我需要一些关于如何测量这个的指导。 到目前为止我考虑的替代方案是 使用JMX ThreadMXBean来测量调用JNI方法调用的当前线程的系统CPU使用率。 但是,我不确定JNI代码是否在调用线程上下文中执行。 当线程产生更multithreading时会发生什么? 使用JMX OperatingSystemMXBean获取整个JVM的CPU使用率。 理想情况下,这不是我想要的,因为在JVM中可能存在可能调整基准测试的并行执行。 使用getrusage(..)外部测量。 我想知道的是它与使用OperatingSystemMXBean有何不同。