mas*_*oud 3 c++ java benchmarking gcc
我做了一个简单的测试,我知道C++更快但我的测试结果不切实际.
C++代码是:
#include <stdio.h>
#include <windows.h>
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 - start.QuadPart) / freq.QuadPart * 1000.0;
printf("Delta: %f\n", d);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Java代码是:
public class JavaApplication5 {
public static long s(long n) {
long s = 0;
for (long i = 0; i < n; i++) {
s += i;
}
return s;
}
public static void main(String[] args) {
long start = System.nanoTime();
System.out.println(s(1000000000));
long end = System.nanoTime();
System.out.println((end - start)/1000000);
}
}
Run Code Online (Sandbox Code Playgroud)
C++编译器:gcc 4.4.0和Java:jdk 1.6.0
Java: 2795 ms
C++ : 0.013517 ms
它说C++比Java快206777倍!没门!我的测试有什么问题?
显示您使用的编译器选项.而你的真实代码(#include <stdio>
不是你真正的代码).
您的C++编译器比Java编译器更加智能(在您的情况下这是正确的,但并非每个C++编译器都比每个Java编译器更智能),并且它预先计算了结果.你唯一要考虑的是printf
通话.
在Java使用的大多数任务中,它的表现与C++一样.
VM语言(Java,C#)具有与JIT编译相关的额外成本,但也可以从更高效的内存分配和跨共享库的内联中受益.而C++在访问OS系统调用方面要快得多.除此之外,可以仔细调整C++内存布局以实现缓存行为; 你没有在托管语言中获得这种级别的控制.
哪些因素影响更大是完全针对特定应用的.任何做出"C++比Java更快"或"Java总体上比C++更快"的一揽子声明的人都是白痴.平均值无关紧要.您的申请表现很重要.
这是我的证明,gcc正在预先计算答案.
在这段代码上:
#include <stdio.h>
#include <windows.h>
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( int argc, char** argv )
{
LARGE_INTEGER freq, start, end;
QueryPerformanceFrequency(&freq);
QueryPerformanceCounter(&start);
printf("%llu\n", s(1000000000));
QueryPerformanceCounter(&end);
double d = (double) (end.QuadPart - start.QuadPart) / freq.QuadPart * 1000.0;
printf("Delta: %f\n", d);
QueryPerformanceCounter(&start);
printf("%llu\n", s(atol(argv[1])));
QueryPerformanceCounter(&end);
d = (double) (end.QuadPart - start.QuadPart) / freq.QuadPart * 1000.0;
printf("Delta: %f\n", d);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用gcc-4.3.4,使用命令行./g++-4 -omasoud-gcc.exe -O3 masoud.cpp
:
bash-3.2# ./masoud-gcc 1000000000
499999999500000000
Delta: 0.845755
499999999500000000
Delta: 1114.105866
Run Code Online (Sandbox Code Playgroud)
相比之下,MSVC++ 16.00.40219.01 for x64(2010 SP1),命令行cl /Ox masoud.cpp
:
> masoud 1000000000
499999999500000000
Delta: 229.684364
499999999500000000
Delta: 354.275606
Run Code Online (Sandbox Code Playgroud)
VC++没有预先计算答案,但64位代码执行循环的速度要快三倍以上.这是Java应该接近的速度.
更有趣的事实:gcc预先计算答案的速度比它生成的代码更快,以便计算出答案.编译gcc的时间:
real 0m0.886s
user 0m0.248s
sys 0m0.185s
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2335 次 |
最近记录: |