C++和Java的字符串循环性能比较
C++ and Java's Looping on Strings performance comparisons
我已经针对循环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上)。所以你会成为法官。
谢谢。
- OpenMP for 循环并行性问题
- 与多个 for 循环与单个 for 循环 wrt 相关的性能从多映射获取数据
- 基于范围的 for 循环range_declaration中各种说明符之间的性能差异
- C++中循环的性能差异
- 需要帮助编写一个小程序来将循环乘以 n 个元素和 k 个多重性
- C++循环性能的倍数
- OpenMP 嵌套循环处理性能
- C++:if 内部循环的性能影响
- openMp的多个独立for循环的性能问题
- 在两者中使用基类和派生类作为数组时的循环性
- 具有相同索引的循环的性能
- C++循环展开性能差异(欧拉项目)
- 为什么具有多线程的for循环的性能不如单线程
- 在 x 时间后结束循环的性能最低占用方式
- C++ 循环展开性能
- 将一个循环分解为两个循环的性能
- c++循环的性能:变量初始化
- 检查矢量的可用性(性能问题)
- 两个几乎相同循环的性能差异
- c++中嵌套for循环的性能评估