我得到的结论是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
*/