【发布时间】:2017-07-05 11:29:33
【问题描述】:
我针对 C++(在 Visual Studio Community Edition 2015 中实现)和 Java (1.7) for 循环进行了一些性能测试。
以下是源代码:
Java:
long startTime = 0;
long endTime = 0;
long totalTime = 0;
startTime = System.currentTimeMillis();
for (long counter = 0; counter < numberOfIterations; counter++)
{
System.out.println("01234");
}
endTime = System.currentTimeMillis();
totalTime = endTime - startTime;
C++(基于 Windows,发布版本 x64,针对速度进行了优化):
ULONGLONG startTime = 0;
ULONGLONG endTime = 0;
ULONGLONG elapsedTime = 0;
startTime = GetTickCount64();
for (LONGLONG counter = 0; counter < numberOfIterations; counter++)
{
cout << "01234" << endl;
}
endTime = GetTickCount64();
elapsedTime = endTime - startTime;
当我将它们旋转/循环 100,000 次时,结果真的让我感到惊讶。
他们来了:
Java:
- 第一次尝试:31,361 毫秒
- 第二次尝试:6,316 毫秒
- 第三次尝试:6,865 毫秒
C++:
- 第一次尝试:40,000 毫秒
- 第二次尝试:37,703 毫秒
- 第三次尝试:20,734 毫秒
然后我又有了一组测试用例
Java:
long startTime = 0;
long endTime = 0;
long totalTime = 0;
startTime = System.currentTimeMillis();
for(long counter = 0; counter < numberOfIterations; counter++) {
String tempString = new String("test");
}
endTime = System.currentTimeMillis();
C++(基于 Windows,发布版本 x64,针对速度进行了优化):
ULONGLONG startTime = 0;
ULONGLONG endTime = 0;
ULONGLONG elapsedTime = 0;
startTime = GetTickCount64();
for (LONGLONG counter = 0; counter < numberOfIterations; counter++)
{
string tempString = "test";
}
endTime = GetTickCount64();
elapsedTime = endTime - startTime;
再次,当我将它们旋转/循环 10,000,000 次时,结果确实更令人惊讶。 他们来了: Java
- 第一次尝试:7 毫秒
- 第二次尝试:7 毫秒
- 第三次尝试:7 毫秒
C++:
- 第一次尝试:125 毫秒
- 第二次尝试:125 毫秒
- 第三次尝试:125 毫秒
但是在 C++ 的空循环上。
在进行此测试之前,我实际上认为 C++ 在低级别或特定于操作系统/平台的实现中将始终胜过 Java。 但是,在这种情况下,这是否意味着 Java 有更有效的方式来处理字符串,特别是如果它已经在卷中?
谢谢
【问题讨论】:
-
这里的问题:您的示例可能太太天真了,无法得出有意义的数字。例如,请参阅stackoverflow.com/questions/504103/…。我的意思是:Java JIT 做了很多优化。它可能很快 认为创建刚刚被丢弃的字符串对象是没有意义的。而对于另一个测试用例:你明白当打印到控制台时(?)大部分时间无论如何都会花在系统调用上?
-
能否请您在第一个 c++ 示例中的循环前添加两行:
ios_base::sync_with_stdio(false);和cin.tie(NULL);,然后再试一次? -
将
endl更改为'\n'。 -
@PeteBecker: 不,
endl是正确的,因为System.out.println也会刷新缓冲区。公平地说,两种语言都应该刷新或不刷新。
标签: java c++ visual-c++