1
xtreme1 2023-12-26 16:37:10 +08:00 3
|
3
chaoschick OP @xtreme1 能解释一下为什么两者性能如此悬殊的原因吗
|
4
chaoschick OP @tool2d 我试试
|
5
hefish 2023-12-26 16:43:16 +08:00
java 的编译器高级。全优化掉了。
|
6
chaoschick OP @tool2d [admin@iZt4ngr7j75qbzgg9ilsifZ c]$ cat duff2.c
#include <sys/time.h> #include <stdio.h> int main(int argc, char* argv[]) { struct timeval start_time, end_time; gettimeofday(&start_time, NULL); long count = 2147483640; volatile long i = 0; do { ++i; } while (--count); gettimeofday(&end_time, NULL); int total_time = 1000000 * (end_time.tv_sec - start_time.tv_sec) + (end_time.tv_usec - start_time.tv_usec); printf("%d us", total_time); printf("\n"); printf("%.3f ms", (double) total_time / 1000); printf("\n"); printf("%l", i); return 0; } [admin@iZt4ngr7j75qbzgg9ilsifZ c]$ gcc duff2.c && ./a.out 4621705 us 4621.705 ms |
7
wdlth 2023-12-26 16:47:26 +08:00
我在我的电脑测试结果是:
0 us 0.000 ms |
8
tool2d 2023-12-26 16:48:17 +08:00
|
9
diivL 2023-12-26 16:51:33 +08:00
gcc duff2.c -O3 && ./a.out
|
10
chaoschick OP public class DuffDevice {
private static long duff2(long count) { long i = 0; do { ++i; } while (--count >0); return i; } public static void main(String[] args) { long duff; long start, end; DuffDevice duffDevice = new DuffDevice(); start = System.currentTimeMillis(); duff = duff2((long) Integer.MAX_VALUE - 7); end = System.currentTimeMillis(); System.out.println(duff + " " + (end - start) + " ms"); } } 输出 2147483640 639 ms 我改了一下 i 值的类型 耗时 变长了 所以 应该没把循环优化掉吧 |
11
chaoschick OP |
12
diivL 2023-12-26 16:58:26 +08:00 1
@chaoschick 你用的是 #6 的代码吗? 用你主贴的代码,然后用 gcc duff2.c -O3 && ./a.out
|
13
chaoschick OP @diivL #include <sys/time.h>
#include <stdio.h> int main(int argc, char* argv[]) { struct timeval start_time, end_time; gettimeofday(&start_time, NULL); long count = 2147483640; long i = 0; do { ++i; } while (--count); gettimeofday(&end_time, NULL); int total_time = 1000000 * (end_time.tv_sec - start_time.tv_sec) + (end_time.tv_usec - start_time.tv_usec); printf("%d us", total_time); printf("\n"); printf("%.3f ms", (double) total_time / 1000); printf("\n"); printf("%l", i); return 0; } [admin@iZt4ngr7j75qbzgg9ilsifZ c]$ gcc duff2.c -O3 && ./a.out 1 us 0.001 ms 这是优化掉 for 循环了吗? |
14
Ericcccccccc 2023-12-26 20:22:00 +08:00
在 main 里做性能测试是无效行为.
而且 java 里有各种 jit, osr 之类的高级优化手段 |
15
iseki 2023-12-26 21:23:09 +08:00 via Android
此外 Java 的 volatile 有额外的语义,所以也没法和 C 对应,这样做 microbench 可能你们很难说明什么问题
|
16
msg7086 2023-12-26 21:51:20 +08:00
> 为什么
因为优化不一样。如果 Java 比 C 快很多,那说明 Java 上优化得比 C 狠,反之亦然。 |
17
Inn0Vat10n 2023-12-26 22:22:54 +08:00
你这里出现这么离谱的结果, 首要原因是编译 C 代码时没开优化
|
18
Cookmilk 2023-12-27 02:09:46 +08:00 via iPhone
C 是直接跑在电脑的 CPU 里,java 跑在虚拟机 CPU 里。测试 for 循环毫无意义。应该测试某一个算法。比如加密算法或者 md5 等等
|
19
mangojiji 2023-12-27 05:41:29 +08:00
又见达夫设备。 ...
|
20
chaoschick OP 以前我一直以为编译器优化能提升的性能很小,这次真是长见识了
|
21
PTLin 2023-12-27 09:16:27 +08:00
这种代码不长的,而且是循环引起的性能问题,建议直接看汇编/字节码,来确定问题以及验证猜想。
或者用完整的性能测试框架测试,避免出现一个优化后测试的,一个还是调试模式测试的的这种低级问题。 |
22
debuggerx 2023-12-27 10:04:17 +08:00
[为什么下面程序递归计算斐波那契数列 java 比 c++要快 - RednaxelaFX 的回答]( https://www.zhihu.com/question/56683164/answer/150190561)
|
23
LiaoMatt 2023-12-27 14:32:47 +08:00
C 代码的变量用 register 修饰会不会更快
|