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

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倍!没门!我的测试有什么问题?

Ben*_*igt 7

显示您使用的编译器选项.而你的真实代码(#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)