java与c++ 效率对照,容器和字符串处理为例
java与c++ 效率对比,容器和字符串处理为例
2. java代码,使用deque
4. java 字符串
我得到的结论是2.5:1。
这也就可以解释为什么iphone上的软件运行会更快(objective-c和c++一样都是native模式的代码)。注意c++要用release版本运行。。。所以学习c++的童鞋们,,放心大胆的学下去吧。在以后的终端为王的时代里,大家会更加注意效率。软件跑得快才能赢。
1. c++代码,使用deque
#include <iostream> #include <windows.h> #include <deque> using namespace std; long factor(long i) { if (i <= 1) { return 1; } else { return (i * factor(i - 1)); } } void main() { deque<long> intDeque; double start = GetTickCount(); for (int count = 0; count < 50000000; count ++) { for (int i = 1; i < 12; i ++) { intDeque.push_back(factor(i)); //cout << factor(i) << endl; } for (int i = 0; i < 12; i ++) { intDeque.pop_front(); } } cout << GetTickCount() - start << endl; cout << factor(12) << endl; } /* 11513 479001600 请按任意键继续. . . */
2. java代码,使用deque
package com.ptyt; import java.util.ArrayDeque; import java.util.Deque; import java.util.Queue; public class main { static long factor(long i) { if (i <= 1) { return 1; } else { return (i * factor(i - 1)); } } /** * @param args */ public static void main(String[] args) { Deque<Long> intQueue = new ArrayDeque<Long>(); double start = System.currentTimeMillis(); for (int count = 0; count < 50000000; count ++) { for (int i = 1; i < 12; i ++) { intQueue.addFirst(factor(i)); //cout << factor(i) << endl; } for (int i = 1; i < 12; i ++) { intQueue.removeFirst(); //cout << factor(i) << endl; } } System.out.println(System.currentTimeMillis() - start); System.out.println(factor(12)); } } /* 27141.0 479001600 */
3. c++字符串
#define _AFXDLL #include <string> #include <sstream> #include <iostream> #include <cassert> #include <cstring> #include <ctime> #include <vector> #include <algorithm> #include <afxwin.h> using namespace std; const int TEST_TIMES = 1500000; const char APPEND_CONTENT[] = "cppmule"; const int PREALLOCATE_SIZE = strlen(APPEND_CONTENT) * TEST_TIMES + 1; class Statistic { public: string item; int used; friend inline ostream & operator << (ostream & os, const Statistic &stat) { os << "item: " << stat.item << endl << "used: " << stat.used << " ms." << endl << endl; return os; } inline bool operator>(const Statistic& stat) { return (used > stat.used); } inline bool operator<(const Statistic& stat) { return (used < stat.used); } }; vector<Statistic> g_statistics; #define BEGIN_TICK() \ clock_t start = clock(); #define END_AND_PRINT_TICK(info) \ clock_t used = clock() - start; \ Statistic stat; \ stat.item.assign(info); \ stat.used = used; \ g_statistics.push_back(stat); \ cout << info << " Used: " << used << " ms." << endl; #define PRINT_SORT_TEST_TICKS() \ sort(g_statistics.begin(), g_statistics.end()); \ struct StatisticPrinter { \ StatisticPrinter() : order(0) {} \ void operator() (const Statistic& stat) { \ ++order; \ cout << "sort order: " << order << endl \ << stat; \ } \ int order; \ } printer; \ cout << "---------Statistics informations(sorting ascendent)-------" << endl << endl; \ for_each(g_statistics.begin(), g_statistics.end(), printer);\ cout << "----------------------" << endl; void test_stdstring_append() { string str; BEGIN_TICK(); for (int i=0; i<TEST_TIMES; i++) { str.append(APPEND_CONTENT); } END_AND_PRINT_TICK("std::string append"); cout << "string length: " << str.length() << endl; } void test_stdstring_append_operator() { string str; BEGIN_TICK(); for (int i=0; i<TEST_TIMES; i++) { str += APPEND_CONTENT; } END_AND_PRINT_TICK("std::string += operator"); cout << "string length: " << str.length() << endl; } void test_stdostringstream() { ostringstream oss; BEGIN_TICK(); for (int i=0; i<TEST_TIMES; i++) { oss << APPEND_CONTENT; } END_AND_PRINT_TICK("std::ostringstream <<"); cout << "string length: " << oss.str().length() << endl; } void test_stdostringstream_preallocate() { ostringstream oss; BEGIN_TICK(); for (int i=0; i<TEST_TIMES; i++) { oss << APPEND_CONTENT; } END_AND_PRINT_TICK("std::ostringstream <<"); cout << "string length: " << oss.str().length() << endl; } void test_stdstring_append_operator_preallocate() { string str; str.reserve(PREALLOCATE_SIZE); cout << "capacity: " << str.capacity() << endl << "size: " << str.size() << endl; //assert(str.capacity() == 1024*1024*512); BEGIN_TICK(); for (int i=0; i<TEST_TIMES; i++) { str += APPEND_CONTENT; } END_AND_PRINT_TICK("hava resize(PREALLOCATE_SIZE) std::string += operator"); cout << "string length: " << str.length() << endl; } void test_c_strcat_append() { char* pstr = (char*)malloc(PREALLOCATE_SIZE); memset(pstr, 0, sizeof(pstr)); BEGIN_TICK(); for (int i=0; i<TEST_TIMES; i++) { strcat(pstr, APPEND_CONTENT); } END_AND_PRINT_TICK("c string function strcat:"); cout << "string length: " << strlen(pstr) << endl; free(pstr); pstr = NULL; } void test_c_memcpy_append() { //Allocate memory char* pstr = (char*)malloc(PREALLOCATE_SIZE); if (NULL == pstr) { cerr << "Can't allocate memory." << endl; return; } memset(pstr, 0, PREALLOCATE_SIZE); BEGIN_TICK(); int len = 0; for (int i=0; i<TEST_TIMES; i++) { memcpy(pstr + len, APPEND_CONTENT, strlen(APPEND_CONTENT)); len += strlen(APPEND_CONTENT); } END_AND_PRINT_TICK("C language memcpy append"); cout << "string length: " << strlen(pstr) << endl; //Cleanup free(pstr); pstr = NULL; } void test_mfc_cstring_append() { CString str; BEGIN_TICK(); for (int i=0; i<TEST_TIMES; i++) { str.Append(APPEND_CONTENT); } END_AND_PRINT_TICK("MFC CString append"); cout << "string length: " << str.GetLength() << endl; } void test_mfc_cstring_append_operator() { CString str; BEGIN_TICK(); for (int i=0; i<TEST_TIMES; i++) { str += APPEND_CONTENT; } END_AND_PRINT_TICK("MFC CString operator append"); cout << "string length: " << str.GetLength() << endl; } int _tmain(int argc, _TCHAR* argv[]) { #ifdef _DEBUG cout << "DEBUG version." << endl; #else cout << "Release version." << endl; #endif cout << "TEST_TIME: " << TEST_TIMES << endl; test_c_memcpy_append(); test_stdstring_append_operator(); test_stdstring_append(); test_stdostringstream(); test_stdstring_append_operator_preallocate(); test_mfc_cstring_append(); test_mfc_cstring_append_operator(); //test_c_strcat_append(); PRINT_SORT_TEST_TICKS(); return 0; } /* Release version. TEST_TIME: 1500000 C language memcpy append Used: 5 ms. string length: 10500000 std::string += operator Used: 52 ms. string length: 10500000 std::string append Used: 51 ms. string length: 10500000 std::ostringstream << Used: 195 ms. string length: 10500000 capacity: 10500015 size: 0 hava resize(PREALLOCATE_SIZE) std::string += operator Used: 30 ms. string length: 10500000 MFC CString append Used: 82 ms. string length: 10500000 MFC CString operator append Used: 87 ms. string length: 10500000 ---------Statistics informations(sorting ascendent)------- sort order: 1 item: C language memcpy append used: 5 ms. sort order: 2 item: hava resize(PREALLOCATE_SIZE) std::string += operator used: 30 ms. sort order: 3 item: std::string append used: 51 ms. sort order: 4 item: std::string += operator used: 52 ms. sort order: 5 item: MFC CString append used: 82 ms. sort order: 6 item: MFC CString operator append used: 87 ms. sort order: 7 item: std::ostringstream << used: 195 ms. ---------------------- */
4. java 字符串
package com.ptyt; import java.util.ArrayDeque; import java.util.Deque; import java.util.Queue; public class main { public static void testJavaStringPerformance() { final int TEST_TIMES = 1500000; // String // String str = new String(); // // System.out.println("The testing is running, please wait..."); // long start = System.currentTimeMillis(); // for (int i = 0; i < TEST_TIMES; i++) { // str += "cppmule"; // } // long strUsed = System.currentTimeMillis() - start; // System.out.println("strUsed: " + strUsed + " ms."); // StringBuffer long start = 0; StringBuffer strBuffer = new StringBuffer(); start = System.currentTimeMillis(); for (int i = 0; i < TEST_TIMES; i++) { strBuffer.append("cppmule"); } long strBufferUsed = System.currentTimeMillis() - start; System.out.println("StringBuffer append: " + strBufferUsed + " ms."); // StringBuilder start = 0; StringBuilder strBuilder = new StringBuilder(); start = System.currentTimeMillis(); for (int i = 0; i < TEST_TIMES; i++) { strBuilder.append("cppmule"); } long strBuilderUsed = System.currentTimeMillis() - start; System.out.println("StringBuilder append: " + strBuilderUsed + " ms."); System.out.println("Times: " + TEST_TIMES); } /** * @param args */ public static void main(String[] args) { testJavaStringPerformance(); } } /* StringBuffer append: 173 ms. StringBuilder append: 110 ms. Times: 1500000 */