C++和Java的字符串循环性能比较

C++ and Java's Looping on Strings performance comparisons

本文关键字:循环性 性能 性能比 比较 循环 字符串 Java C++      更新时间:2023-10-16

我已经针对循环C++(在Visual Studio Community Edition 2015中实现)和Java(1.7)进行了一些性能测试。
以下是源代码:

爪哇岛:

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 次时,结果真的让我感到惊讶。 他们在这里:
爪哇岛:

  • 第一次尝试:31,361 毫秒
  • 第二次尝试:6,316
  • 毫秒
  • 第三次尝试:6,865
  • 毫秒

C++:

  • 第一次尝试:40,000 毫秒
  • 第二次尝试:37,703 毫秒
  • 第三次尝试:20,734 毫秒

然后我有另一组测试用例

爪哇岛:

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 次时,结果确实更令人惊讶。 他们在这里:爪哇岛

  • 第一次尝试:7 毫秒
  • 第二次尝试:7 毫秒
  • 第三次尝试:7 毫秒

C++:

  • 第一次尝试:125 毫秒
  • 第二次尝试:125 毫秒
  • 第三次尝试:125 毫秒

但是在空循环中C++。

在做这个测试之前,我实际上认为C++总是在低级或特定于操作系统/平台的实现中执行Java。 但是,在这种情况下,这是否意味着Java有更有效的方式来处理字符串,特别是如果它已经在卷中?



谢谢

最后,我能够按照我的承诺抽出时间在这里发布答案。但我对此表示歉意。无论如何,这是我收集的统计数据。请耐心等待,这是一个相当冗长的答案。顺便说一句,它们都是在 Windows 10 专业版 x64 机器中执行的 =)!


第一个代码(C++和Java): 在 Windows 上的 Java 中:

public void testForLoopCreateInt(long numberOfIterations) {
ArrayList<Integer> listOfIntegers = new ArrayList<Integer>();
long startTime = 0;
long endTime = 0;
long totalTime = 0;
System.out.println("n===========================" + "ntestForLoopCreateInt() Looping for: " + numberOfIterations);
startTime = System.currentTimeMillis();
for(long counter = 0; counter < numberOfIterations; counter++) {
int i = 0;
listOfIntegers.add(i);
}
endTime = System.currentTimeMillis();
totalTime = endTime - startTime;
System.out.println("Total time: " + totalTime + " milliseconds");
System.out.println("===========================testForLoopCreateInt()");
for (int indexer = 0; indexer < 10; indexer++) {
int y = listOfIntegers.get(indexer);
}
}

在某些 Win32 API 上C++:

void Loops::testForLoopCreateInt(LONGLONG numberOfIterations)
{
cout << "n===========================" << "ntestForLoopCreateInt() Looping for: " << numberOfIterations << endl;
vector<int> vectorOfInts;
high_resolution_clock::time_point startTime = high_resolution_clock::now();
for (LONGLONG counter = 0; counter < numberOfIterations; counter++)
{
int i = 0;
vectorOfInts.push_back(i);
}
high_resolution_clock::time_point endTime = high_resolution_clock::now();
duration<double, std::milli> totalTime = endTime - startTime;
cout << "Total time: " << totalTime.count() << " milliseconds" << endl;
cout << "===========================testForLoopCreateInt()" << endl;
for (int indexer = 0; indexer < 10; indexer++) {
int y = vectorOfInts.at(indexer);
}
}

当每个迭代次数都设置为某个值时,结果如下:

爪哇岛:

  • 10 次迭代:0.00 ms
  • 100 次迭代:0.00 ms
  • 1000 次迭代:0.00 ms
  • 10000 次迭代:1.00 ms
  • 100000 次迭代:4.00 ms
  • 1000000 次迭代:12.00 ms
  • 10000000
  • 次迭代:106.00 ms
  • 100000000 次迭代:1,747.00 ms

C++:

  • 10 次迭代:0.001803 ms
  • 100 次迭代:0.00601 ms
  • 1000 次迭代:0.013521 ms
  • 10000 次迭代:0.067005 ms
  • 100000 次迭代:0.506291 ms
  • 1000000 次迭代:4.4806 ms
  • 10000000 次迭代:61.1632 ms
  • 100000000 次迭代:679.341 ms

第二种代码(C++和Java): 在 Windows 上的 Java 中:

public void testForLoopCreateUniformStringAndStoreToArrayList(long numberOfIterations) {
ArrayList<String> listOfIntegers = new ArrayList<String>();
long startTime = 0;
long endTime = 0;
long totalTime = 0;
System.out.println("n===========================" + "ntestForLoopCreateUniformStringAndStoreToArrayList() Looping for: " + numberOfIterations);
startTime = System.currentTimeMillis();
for(long counter = 0; counter < numberOfIterations; counter++) {
String string = new String("01234");
listOfIntegers.add(string);
}
endTime = System.currentTimeMillis();
totalTime = endTime - startTime;
System.out.println("Total time: " + totalTime + " milliseconds");
System.out.println("===========================testForLoopCreateUniformStringAndStoreToArrayList()");
for (int indexer = 0; indexer < 10; indexer++) {
String y = listOfIntegers.get(indexer);
}
}

在某些 Win32 API 上C++:

void Loops::testForLoopCreateUniformStringAndStoreToVector(LONGLONG numberOfIterations)
{
cout << "n===========================" << "ntestForLoopCreateUniformStringAndStoreToVector() Looping for: " << numberOfIterations << endl;
vector<string> vectorOfStrings;
high_resolution_clock::time_point startTime = high_resolution_clock::now();
for (LONGLONG counter = 0; counter < numberOfIterations; counter++)
{
string str000("01234");
vectorOfStrings.push_back(str000);
}
high_resolution_clock::time_point endTime = high_resolution_clock::now();
duration<double, std::milli> totalTime = endTime - startTime;
cout << "Total time: " << totalTime.count() << " milliseconds" << endl;
cout << "===========================testForLoopCreateUniformStringAndStoreToVector()" << endl;
for (int indexer = 0; indexer < 10; indexer++) {
string y = vectorOfStrings.at(indexer);
}
}

当每个迭代次数都设置为某个值时,结果如下:

爪哇岛:

  • 10 次迭代:0.00 ms
  • 100 次迭代:0.00 ms
  • 1000 次迭代:1.00 ms
  • 10000 次迭代:1.00 ms
  • 100000 次迭代:6.00 ms
  • 1000000 次迭代:24.00 ms
  • 10000000 次迭代:2,742.00 ms
  • 100000000 次迭代:33,371.00 ms

C++:

  • 10 次迭代:0.003605 ms
  • 100 次迭代:0.018329 ms
  • 1000 次迭代:0.064301 ms
  • 10000 次迭代:0.71722 ms
  • 100000 次迭代:13.9406 ms
  • 1000000 次迭代:88.5781 ms
  • 10000000 次迭代:931.526 ms
  • 100000000
  • 次迭代:10,768.9 ms

所以这些是结果,我不确定这是否有偏见,但我正在尽可能公平地对待C++(在Windows上)与Java(在Windows上)。所以你会成为法官。

谢谢。