有这样一个网络传输包。

前端有个固定的包头,包含了后面传输body的长度信息。

在有拷贝的前提下,我们选用什么性能比较高呢?
        方案一
        复用data_buffer string 将Header 头insert到data_buffer中,将大量的字符串后移定长。
        方案二
        将Header外化一个string,然后调用append函数,将data_buffer的字符拷贝到head的string中去。
        方案三
        分配内存,memcpy 过去。
        方案四
        不分配内存,利用栈空间(受限),memcpy过去。
        
        这四种方案那种的效率最高呢?我比较好奇,做了下实验(如无说明,已然-O2优化),测试代码参考
#include <string>
#include <stdio.h>
#include "Utility.h"
int load_file(const char* filename, char** content, size_t* content_len)
{
FILE* fp = fopen(filename, "r");
if (!fp)
{
return -;
}
fseek(fp, , SEEK_END);
size_t len = ftell(fp);
rewind(fp);
char* buf = (char*)malloc(len + );
if (!buf)
{
return -;
}
fread(buf, sizeof(char), len, fp);
buf[len] = '\0';
fclose(fp);
*content = buf;
*content_len = len;
return ;
} int main(int argc, const char *argv[])
{
char* content;
const char* file_name = argv[];
uint32_t space = atoi(argv[]);
uint32_t insert = atoi(argv[]);
size_t len = ;
if (load_file(file_name, &content, &len) < )
{
printf("load %s failed\n", file_name);
return -;
}
std::string raw_content(content, len);
for (int i = ; i < space - ; i++)
{
raw_content.append(content, len);
}
char size_str[];
snprintf(size_str, sizeof(size_str), "%u\t%u",
insert, raw_content.size());
std::string final_content("cooooooo%dddd$%DDD123r423");
{
TimeEval timer(size_str);
if(insert == )
{
raw_content.insert(, final_content);
} if (insert == )
{
final_content.append(raw_content);
}
if (insert == )
{
char* buf = (char*)malloc(final_content.size() + raw_content.size() + );
memcpy(buf, final_content.c_str(), final_content.size());
memcpy(buf + final_content.size(), raw_content.c_str(), raw_content.size());
free(buf);
}
}
return ;
}

性能测试显示

可以看到在insert移动文本长度在k 级别以上时,其效率较拷贝的效率高得多。

个人觉得原因有两个
1)cache
      大数据如果已然cache住,往里面拷贝小数据比较快。
      如果生成两份大数据,往变量中拷贝,cache的可能性要小,程序的局部性变低。
2)内存分配
     通过gcc的代码append 一个大数据,和insert一份小数据,append分配内存空间的可能性要大得多。

由于涉及到内存分配,方案3的效率最低。

方案1 和方案2 的性能差别应该以上由于方案二分配了大量的(标红处)内存空间,gcc的代码如下

结论:
       1. 分配和空间拷贝数据是比较耗时的。在程序中应该尽量减少内存分配。
       2. 如果需要拷贝,则尽量拷贝将小数据拷贝到大数据处,而不是相反。
     

string insert 的性能分析的更多相关文章

  1. Java 集合系列08之 List总结(LinkedList, ArrayList等使用场景和性能分析)

    概要 前面,我们学完了List的全部内容(ArrayList, LinkedList, Vector, Stack). Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例 Ja ...

  2. Java 集合系列 07 List总结(LinkedList, ArrayList等使用场景和性能分析)

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  3. MyBatisPlus性能分析插件,条件构造器,代码自动生成器详解

    性能分析插件 我们在平时的开发中,会遇到一些慢sql,测试,druid MP(MyBatisPlus)也提供性能分析插件,如果超过这个时间就停止 不过官方在3.2版本的时候取消了,原因如下 条件构造器 ...

  4. SQL Server-聚焦IN VS EXISTS VS JOIN性能分析(十九)

    前言 本节我们开始讲讲这一系列性能比较的终极篇IN VS EXISTS VS JOIN的性能分析,前面系列有人一直在说场景不够,这里我们结合查询索引列.非索引列.查询小表.查询大表来综合分析,简短的内 ...

  5. SQL Server-聚焦NOT IN VS NOT EXISTS VS LEFT JOIN...IS NULL性能分析(十八)

    前言 本节我们来综合比较NOT IN VS NOT EXISTS VS LEFT JOIN...IS NULL的性能,简短的内容,深入的理解,Always to review the basics. ...

  6. SQL Server-聚焦EXISTS AND IN性能分析(十六)

    前言 前面我们学习了NOT EXISTS和NOT IN的比较,当然少不了EXISTS和IN的比较,所以本节我们来学习EXISTS和IN的比较,简短的内容,深入的理解,Always to review ...

  7. SQL Server-聚焦INNER JOIN AND IN性能分析(十四)

    前言 本节我们来讲讲联接综合知识,我们在大多教程或理论书上都在讲用哪好,哪个性能不如哪个的性能,但是真正讲到问题的实质却不是太多,所以才有了本系列每一篇的篇幅不是太多,但是肯定是我用心去查找许多资料而 ...

  8. 性能分析神器VisualVM

    VisualVM 是一款免费的,集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优.这些功能包括生成和分析海量数据.跟踪内存泄漏.监控垃圾回 ...

  9. MySQL性能分析及explain的使用

    MySQL性能分析及explain用法的知识 1.使用explain语句去查看分析结果 如explain select * from test1 where id=1;会出现:id  selectty ...

随机推荐

  1. PHP 语言需要避免的 10 大误区

    PHP是一种非常流行的开源服务器端脚本语言,你在万维网看到的大多数网站都是使用php开发的.但是,你大概很奇怪的注意到有少部分的人发誓要离php 远远的.但是令人更奇怪的是或者很震惊的说他们不用php ...

  2. IS_ERR、PTR_ERR、ERR_PTR

    最近在使用filp_open打开文件时遇到到一个问题,当打开一个并不存在的文件时,filp_open返回值值为0xfffffffe,而并不是0(NULL),这是因为内核对返回指针的函数做了特殊处理.内 ...

  3. UserAccountInfo时间倒计时

    界面如下: 代码如下: using System;using System.Collections.Generic;using System.ComponentModel;using System.D ...

  4. php扩展函数调用扩展中的标准函数

    这几天在写php的扩展函数,在网上学习步骤什么的都有,一般问题也都能查到,所以就不再此啰嗦,写这篇博客的原因是因为遇到的一个问题,百度谷歌都没找到,对于初学者,这个或许有用,对于过来人,我想他们肯定也 ...

  5. 8天学通MongoDB——第六天 分片技术

    在mongodb里面存在另一种集群,就是分片技术,跟sql server的表分区类似,我们知道当数据量达到T级别的时候,我们的磁盘,内存 就吃不消了,针对这样的场景我们该如何应对. 一:分片 mong ...

  6. Mac系统在终端中查看CPU信息的命令

    在mac os x的终端中以命令行的形式查看本机cpu信息: sysctl -n machdep.cpu.brand_string E.G. lis-mbp:Home jenkins$ sysctl ...

  7. MSSQL中把表中的数据导出成Insert

    use master go if exists (select name from sysobjects where name = 'sp_generate_insert_script') begin ...

  8. (任寒韬)WebApp群主 - MobileTech 资料

    web app : http://www.lightapp.cn/brand/index/4101 https://github.com/jtyjty99999/mobileTech/blob/mas ...

  9. shiro实现APP、web统一登录认证和权限管理

    先说下背景,项目包含一个管理系统(web)和门户网站(web),还有一个手机APP(包括Android和IOS),三个系统共用一个后端,在后端使用shiro进行登录认证和权限控制.好的,那么问题来了w ...

  10. JavaScript学习笔记(备忘录)

    ===运算符 判断数值和类型是否相等.如: console.log('s'==='s') //输出trueconsole.log('1'===1) //输出false