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因为要兼容早期的原因,不得不保留传统的机制。

时间: 2024-10-16 18:52:19

c++性能之对象与指针性能比较、以及java与c++性能对比实测的相关文章

How to improve Java&amp;#39;s I/O performance( 提升 java i/o 性能)

原文:http://www.javaworld.com/article/2077523/build-ci-sdlc/java-tip-26--how-to-improve-java-s-i-o-performance.html JDK 1.0.2 的 java.io 包暴露了非常多I/O性能问题.这里将介绍一个优化方案,附加一个关闭同步的方法. Java的I/O性能以前是非常多Java应用的瓶颈.主要原因就是JDK1.0.2的java.io包的不良设计和实现.关键问题是缓冲.绝大多数java.i

How to improve Java&#39;s I/O performance( 提升 java i/o 性能)

原文:http://www.javaworld.com/article/2077523/build-ci-sdlc/java-tip-26--how-to-improve-java-s-i-o-performance.html JDK 1.0.2 的 java.io 包暴露了很多I/O性能问题,这里将介绍一个优化方案,附加一个关闭同步的方法. Java的I/O性能曾经是很多Java应用的瓶颈,主要原因就是JDK1.0.2的java.io包的不良设计和实现.关键问题是缓冲,绝大多数java.io中

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

一次性能提高30倍的JAVA类反射性能优化实践 文章来源:宜信技术学院 & 宜信支付结算团队技术分享第4期-支付结算部支付研发团队高级工程师陶红<JAVA类反射技术&优化> 分享者:宜信支付结算部支付研发团队高级工程师陶红 原文首发于宜信支付结算技术团队公号:野指针 在实际工作中的一些特定应用场景下,JAVA类反射是经常用到.必不可少的技术,在项目研发过程中,我们也遇到了不得不运用JAVA类反射技术的业务需求,并且不可避免地面临这个技术固有的性能瓶颈问题. 通过近两年的研究.尝

java流的性能优化1-文件复制

传统的I/O速度相对比较慢,它会成为系统性能的瓶颈,所以在java1.4之后提供了NIO,它是一种全新的流:它具有以下特性: 1.为所有的原是类型提供Buffer缓存支持: 2.使用java.nio.charset.Charset作为字符编码解码解决方案: 3.增加通道(Channel)对象,作为新的原始I/O抽象: 4.支持锁和内存映射文件的文件访问接口: 5.提供基于Selector的异步网络I/O: NIO是一种全新的流,跟流式的I/O不同,NIO是基于块的,它以块为基本单位处理数据.在N

JProfiler 解决 Java 服务器的性能跟踪

作者:徐建祥([email protected]) 时间: 2006/01/05 来自:http://www.anymobile.org 1.摘要..........................................................................12.改善服务器的性能...........................................................13.分析器原理.........................

Java 自带性能监控工具:监视和管理控制台 jconsole 的使用

1. 前言 想验证你对 jvm 配的一些调优参数(比如 Xms.Xmx 等)有没有起作用吗? 想不想实时监控你自定义的线程池的在实际运行时的线程个数.有没有死锁? 应用出现 java.lang.OutOfMemoryError: Java heap space,你知道需要去调整 Xms.Xmx.想不想实时监控你的 Java 应用的堆内存使用情况,并根据峰值等数据设置最适合你的 Xms.Xmx 等参数? 应用出现 java.lang.OutOfMemoryError: PermGen space,

使用Memcached改进Java企业级应用性能:架构和设置

Memcached由Danga Interactive开发,用来提升LiveJournal.com网站性能.Memcached分布式架构支持众多的社交网络应用,Twitter.Facebook还有Wikipedia.在接下来的两部分教程中,Sunil Patil介绍了Memcached分布式哈希表架构,以及利用它帮助你为数据驱动Java企业应用做数据缓存. 本文介绍了如何利用Memcached提升Java企业应用性能.首先,总览了传统的Java缓存框架,并和Memcached做一个比较.当然,也

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

NetBeans IDE 6.0 包含一个强大的性能分析工具,可提供与应用程序运行时行为有关的重要信息.通过 NetBeans 性能分析工具,我们可以方便地在 IDE 中监控应用程序的线程状态.CPU 性能以及内存使用情况,而且产生的开销相对较少. 本文将概述 IDE 中包含的性能分析工具,并指导您快速开始分析 NetBeans 项目的性能.本文旨在演示 IDE 中可用的各种性能分析任务以及分析项目性能时可以获得的分析结果.但并不覆盖 IDE 中包含的所有性能分析功能,也不会深入探索如何研究性能

java字符串格式化性能对比String.format/StringBuilder/+拼接

String.format由于每次都有生成一个Formatter对象,因此速度会比较慢,在大数据量需要格式化处理的时候,避免使用String.format进行格式化,相反使用StringUtils.leftPad,StringUtils.rightPad,然后使用+一次性(注:分为多个独立的+性能会受到较大影响)或者StringBuilder进行拼接能够极大地提升性能.LZ在一个海量数据导出场景中,改写后(其中包括很多BigDecimal及计算)导出格式化性能提升了大约2/3.纯粹的字符串格式化