gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:06:32 24 4
gpt4 key购买 nike

我做了一个简单的测试,我知道 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com