- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我做了一个简单的测试,我知道 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;
}
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);
}
}
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++ 在访问操作系统系统调用方面要快得多。除此之外,还可以针对缓存行为仔细调整 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;
}
使用 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
相比之下,MSVC++ 16.00.40219.01 for x64 (2010 SP1),命令行 cl /Ox masoud.cpp
:
> masoud 1000000000
499999999500000000
Delta: 229.684364
499999999500000000
Delta: 354.275606
VC++ 没有预先计算答案,但 64 位代码确实以三倍多的速度执行循环。这是Java应该接近的速度。
更多有趣的事实:gcc 预计算答案的速度比它生成的代码更快。 gcc 的编译时间:
real 0m0.886s
user 0m0.248s
sys 0m0.185s
关于java - 基准 C++ 与 Java,不切实际的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7570484/
我是一名优秀的程序员,十分优秀!