java与c++ 效率对比,容器和字符串处理为例

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

 */


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值