为了更加直观的比较,好吧,我们选择以对象的初始化并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=;i<;i++) {
FirstCPPCls clz;
clz.setAppVersion("12.32.33");
clz.setClusterName("osm-service");
clz.setCompanyId("");
clz.setServiceId("sysL.1.223");
clz.setSubSystemId("");
clz.setSystemId("");
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[];
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) {
memset(serviceId,,);
memcpy(serviceId,v,strlen(v));
}
inline void setSystemId(char* v) {
memset(systemId,,);
memcpy(systemId,v,strlen(v));
}
inline void setSubSystemId(char* v) {
memset(subSystemId,,);
memcpy(subSystemId,v,strlen(v));
}
inline void setAppVersion(char* v) {
memset(appVersion,,);
memcpy(appVersion,v,strlen(v));
}
inline void setCompanyId(char* v) {
memset(companyId,,);
memcpy(companyId,v,strlen(v));
}
inline void setClusterName(char* v) {
memset(clusterName,,);
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++性能对比实测的更多相关文章

  1. Java-Runoob-高级教程-实例-字符串:11. Java 实例 - 字符串性能比较测试

    ylbtech-Java-Runoob-高级教程-实例-字符串:11. Java 实例 - 字符串性能比较测试 1.返回顶部 1. Java 实例 - 字符串性能比较测试  Java 实例 以下实例演 ...

  2. 使用 W3C Performance 对象通过 R 和 JavaScript 将浏览器内的性能数据可视化[转]

    当考虑 Web 性能指标时,需要关注的目标数字应该是从您自己的用户那里获得的实际用户指标.最常见的方法是利用 Splunk 之类的工具来分析您的机器数据,该工具支持您分析和可视化您的访问权限和错误日志 ...

  3. 转:STL容器里存放对象还是指针

    一.问题的引出: 容器可以存放对象,可以存放指针,这里要谈的是两者的使用问题.就是什么时候存放对象更好,什么时候存放指针更好? 二.问题的分析过程: 1. 首先说下stl容器的工作方式   对于内建类 ...

  4. 如何利用缓存机制实现JAVA类反射性能提升30倍

    一次性能提高30倍的JAVA类反射性能优化实践 文章来源:宜信技术学院 & 宜信支付结算团队技术分享第4期-支付结算部支付研发团队高级工程师陶红<JAVA类反射技术&优化> ...

  5. JVM常用命令和性能调优建议 [Could not create the Java virtual machine]

    一.查看jvm常用命令jinfo:可以输出并修改运行时的java 进程的opts. jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号. ...

  6. jvm 命令使用调优 通过jstat、jmap对java程序进行性能调优

    转载:http://blog.csdn.net/jerry024/article/details/8507589 转载: https://blog.csdn.net/zhaozheng7758/art ...

  7. 在 NetBeans IDE 6.0 中分析 Java 应用程序性能

    NetBeans IDE 6.0 包含一个强大的性能分析工具,可提供与应用程序运行时行为有关的重要信息.通过 NetBeans 性能分析工具,我们可以方便地在 IDE 中监控应用程序的线程状态.CPU ...

  8. lua、groovy嵌入到java中的性能对比(转)

    lua和groovy都是可以嵌入到java中的脚本语言.lua以高性能著称,与C/C++在游戏开放中有较多使用,groovy是一个基于Java虚拟机(JVM)的敏捷动态语言,在jvm下有着不错的性能. ...

  9. java反射之-性能优化

    在最近的计划中,打算看看在不使用google protobuf的情况下,在原有的采用jackson作为json序列化工具的基础上,是否可以实现进一步的性能优化.主要是针对list的情况. 测试的时候选 ...

随机推荐

  1. linux使用bin文件安装jdk

    jdk1.6.20文件为bin文件安装过程如下 添加执行权限 chmod +x jdk-6u20-linux-x64.bin 运行,出现提示需要输入yes ./jdk-6u20-linux-x64.b ...

  2. 【转】Ant与Ivy的安装

    一.简介 Apache Ant,是一个将软件编译.测试.部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发.更多介绍 Apache Ivy,是一个管理项目依赖的工具.更多介绍请 ...

  3. Oracle核心技术之 SQL TRACE

    1.SQL TRACE说明: 参数类型 布尔型 缺省值 false 参数类别 动态 取值范围 True|false 2.类型 1)sql trace参数:alter system改变对全局进程影响,如 ...

  4. msc文件

    MSC微软管理控制台(Microsoft Management Control)文件.可以点击开始/运行,然后输入下列文件名就可以打开相应的控制窗口. 除第三个文件外,其他均在C:\WINDOWS\s ...

  5. mysql主从服务器的配置

    使用mysql主从复制的好处有: 1.采用主从服务器这种架构,稳定性得以提升.如果主服务器发生故障,我们可以使用从服务器来提供服务. 2.在主从服务器上分开处理用户的请求,可以提升数据处理效率. 3. ...

  6. ARP报文

    硬件类型:指明了发送方想知道的硬件接口类型,以太网的值为1: 协议类型:指明了发送方提供的高层协议类型,IP为0x0800(16进制): 硬件地址长度和协议长度:指明了硬件地址和高层协议地址的长度,这 ...

  7. table 的td 自适应事项

    media的html结构,如果用display:table-cell实现, table { width: 100%; border-collapse: collapse; border: $bor; ...

  8. mysql 数据操作 单表查询 目录

    mysql 数据操作 单表查询 mysql 数据操作 单表查询 简单查询 避免重复DISTINCT mysql 数据操作 单表查询 通过四则运算查询 mysql 数据操作 单表查询 concat()函 ...

  9. 用laravel dingo api插件库创建api的一些心得笔记

    用laravel创建api是很多大型项目正在使用的方法,一般他们都是用dingo api插件库来开发自己的api.以下是ytkah用dingo api的一些心得,有需要的朋友可以关注一下 1.安装 因 ...

  10. NYOJ 275 队花的烦恼一

    队花的烦恼一 时间限制:3000 ms  |  内存限制:65535 KB 难度:1 描写叙述 ACM队的队花C小+常常抱怨:"C语言中的格式输出中有十六.十.八进制输出,然而却没有二进制输 ...