日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++性能之对象与指针性能比较、以及java与c++性能对比实测

發布時間:2024/4/17 c/c++ 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++性能之对象与指针性能比较、以及java与c++性能对比实测 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為了更加直觀的比較,好吧,我們選擇以對象的初始化并add到list為例子。

首先,定義object如下:

#include <string> #pragma once using namespace std; class FirstCPPCls {private:string serviceId;string systemId;string subSystemId;string appVersion;string companyId;string clusterName;public:FirstCPPCls(void);~FirstCPPCls(void);inline string getServiceId() { return serviceId;}inline string getSystemId() { return systemId;}inline string getSubSystemId() { return subSystemId;}inline string getAppVersion() { return appVersion;}inline string getCompanyId() { return companyId;}inline string getClusterName() { return clusterName;}inline void setServiceId(string v) { serviceId = v;}inline void setSystemId(string v) { systemId = v;}inline void setSubSystemId(string v) { subSystemId = v;}inline void setAppVersion(string v) { appVersion = v;}inline void setCompanyId(string v) { companyId = v;}inline void setClusterName(string v) { clusterName = v;} }

測試代碼:

// 對象創建時間比較DWORD begin = GetTickCount();int f;vector<FirstCPPCls*> vO;for(i=0;i<100000;i++) {FirstCPPCls clz;clz.setAppVersion("12.32.33");clz.setClusterName("osm-service");clz.setCompanyId("239383");clz.setServiceId("sysL.1.223");clz.setSubSystemId("23");clz.setSystemId("32");vO.push_back(&clz);}cout << vO.size() << endl;DWORD end = GetTickCount();// 打印時間差cout << (end - begin) << endl; // 平均4800豪秒左右system("pause");

java:

public static void main(String[] args) {List<RouteItem> routeItems = new ArrayList<RouteItem>();System.out.println(System.currentTimeMillis());for(int i=0;i<100000;i++) {RouteItem clz = new RouteItem();clz.setAppVersion("12.32.33");clz.setClusterName("osm-service");clz.setCompanyId("239383");clz.setServiceId("sysL.1.223");clz.setSubSystemId("23");clz.setSystemId("32");routeItems.add(clz);}System.out.println(routeItems.size());System.out.println(System.currentTimeMillis());
// 平均15ms左右}

好吧,cpp換成char*指針:

#include <string> #pragma once using namespace std; class FirstCPPCls { private:char* serviceId;char* systemId;char* subSystemId;char* appVersion;char* companyId;char* clusterName;public:FirstCPPCls(void);~FirstCPPCls(void);inline char* getServiceId() { return serviceId;}inline char* getSystemId() { return systemId;}inline char* getSubSystemId() { return subSystemId;}inline char* getAppVersion() { return appVersion;}inline char* getCompanyId() { return companyId;}inline char* getClusterName() { return clusterName;}inline void setServiceId(char* v) { serviceId = v;}inline void setSystemId(char* v) { systemId = v;}inline void setSubSystemId(char* v) { subSystemId = v;}inline void setAppVersion(char* v) { appVersion = v;}inline void setCompanyId(char* v) { companyId = v;}inline void setClusterName(char* v) { clusterName = v;}};

再測試,平均大約為46ms。還是比java慢啊。

再看大量代碼中會用到的char[],如下:

#include <string> #pragma once using namespace std; class FirstCPPCls { private:char serviceId[12];char systemId[4];char subSystemId[4];char appVersion[12];char companyId[6];char clusterName[12];public:FirstCPPCls(void);~FirstCPPCls(void);inline char* getServiceId() { return serviceId;}inline char* getSystemId() { return systemId;}inline char* getSubSystemId() { return subSystemId;}inline char* getAppVersion() { return appVersion;}inline char* getCompanyId() { return companyId;}inline char* getClusterName() { return clusterName;}inline void setServiceId(char* v) { memset(serviceId,0,12);memcpy(serviceId,v,strlen(v));}inline void setSystemId(char* v) { memset(systemId,0,4);memcpy(systemId,v,strlen(v));}inline void setSubSystemId(char* v) { memset(subSystemId,0,4);memcpy(subSystemId,v,strlen(v));}inline void setAppVersion(char* v) { memset(appVersion,0,12);memcpy(appVersion,v,strlen(v));}inline void setCompanyId(char* v) { memset(companyId,0,6);memcpy(companyId,v,strlen(v));}inline void setClusterName(char* v) { memset(clusterName,0,12);memcpy(clusterName,v,strlen(v));} };

再測試,平均大約為62ms。還是比java慢啊,大部分情況下,處于可讀性的考慮,應該使用第三種。

后面測試了vector、map之后,發現主要是cpp默認是value拷貝(簡單地說可以認為java中的clone實現吧,當然細節相差還是很大的,尚且這么認為吧)的原因。使用指針后,內容復制消除了很多。

回到java,應該來說發展到jdk 6之后,雖然開發都用object,但是JVM內部將非primitive類型的所有對象都自動轉換為指針操作了,而cpp因為要兼容早期的原因,不得不保留傳統的機制。

注:上述測試是在msvc下測試的,換成gcc之后,string的速度可能會比char *要快,參考http://tieba.baidu.com/p/1038620654,大家可以進行測試。

總結

以上是生活随笔為你收集整理的c++性能之对象与指针性能比较、以及java与c++性能对比实测的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。