假设我的Java程序的瓶颈确实是计算一堆矢量点积的一些紧密循环.是的我已经分析过,是的,它是瓶颈,是的,它是重要的,是的,这就是算法是什么,是的,我运行Proguard来优化字节码等.
这项工作基本上是点产品.因为,我有两个float[50],我需要计算成对产品的总和.我知道处理器指令集可以快速和批量地执行这些操作,如SSE或MMX.
是的我可以通过在JNI中编写一些本机代码来访问它们.JNI电话证明非常昂贵.
我知道你无法保证JIT编译或编译的内容.有没有人曾经听说过使用这些指令的JIT生成的代码?如果有的话,有什么关于Java代码可以帮助它以这种方式编译吗?
可能是"不"; 值得一提.
几个小时前我回答了另一个Stack Overflow问题,结果非常令人惊讶.答案可以在这里找到.答案是/部分错误,但我觉得专注于字节添加.
严格来说,它实际上是字节到长的添加.
这是我一直使用的基准代码:
public class ByteAdditionBenchmark {
private void start() {
int[] sizes = {
700_000,
1_000,
10_000,
25_000,
50_000,
100_000,
200_000,
300_000,
400_000,
500_000,
600_000,
700_000,
};
for (int size : sizes) {
List<byte[]> arrays = createByteArrays(size);
//Warmup
arrays.forEach(this::byteArrayCheck);
benchmark(arrays, this::byteArrayCheck, "byteArrayCheck");
}
}
private void benchmark(final List<byte[]> arrays, final Consumer<byte[]> method, final String name) {
long start = System.nanoTime();
arrays.forEach(method);
long end = System.nanoTime();
double nanosecondsPerIteration = (end - start) * 1d / arrays.size();
System.out.println("Benchmark: …Run Code Online (Sandbox Code Playgroud)