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

标签 java c++ gcc benchmarking

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

相关文章:

c++ - 无法从命令行正确获取数据

c - 为什么 GCC 在为未声明的函数发出警告方面不一致?

c++ - 为什么使用 std::mutex 的函数会对 pthread_key_create 的地址进行空检查?

java - 在方法中保存数组的值

java - HTTP 500 错误失败,状态代码为 200

java - 立即更改图像

java - Spring Security 自定义 AuthenticationException 消息

C++ private static constexpr 成员变量

c++ - 警告 : address of local variable 'angles' returned [-Wreturn-local-addr]

c++ - 懒惰评估是否有效/可优化?