我对使用Visual Studio Community Edition 2015实现的C ++和1.7版本的Java进行了一些循环性能测试。
以下是源代码:
Java:
C++(基于Windows,发布版本x64,优化了速度):
这是一段测试结果的文本,经过100,000次旋转/循环后,我真的感到惊讶。以下是结果:
Java: 1. 第一次尝试:31,361毫秒 2. 第二次尝试:6,316毫秒 3. 第三次尝试:6,865毫秒 C++: 1. 第一次尝试:40,000毫秒 2. 第二次尝试:37,703毫秒 3. 第三次尝试:20,734毫秒
然后我有另一组测试用例。
Java:
C++(基于Windows,发布版本x64,优化速度):
再次进行10,000,000次旋转/循环后,结果实际上更令人惊讶。以下是它们的结果: 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: 1. 第一次尝试:31,361毫秒 2. 第二次尝试:6,316毫秒 3. 第三次尝试:6,865毫秒 C++: 1. 第一次尝试:40,000毫秒 2. 第二次尝试:37,703毫秒 3. 第三次尝试: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有更有效的处理字符串的方式,特别是如果它已经是大量的字符串?
谢谢
ios_base::sync_with_stdio(false);
和cin.tie(NULL);
,然后再试一次? - DAleendl
更改为'\n'
。 - Pete Beckerendl
是正确的,因为System.out.println
也会刷新缓冲区。公平起见,两种语言都应该刷新或不刷新。 - Andre Kampling