标签:style blog http io ar color os sp for
有这样一个网络传输包。
前端有个固定的包头,包含了后面传输body的长度信息。
#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 -1; } fseek(fp, 0, SEEK_END); size_t len = ftell(fp); rewind(fp); char* buf = (char*)malloc(len + 1); if (!buf) { return -2; } fread(buf, sizeof(char), len, fp); buf[len] = ‘\0‘; fclose(fp); *content = buf; *content_len = len; return 0; } int main(int argc, const char *argv[]) { char* content; const char* file_name = argv[1]; uint32_t space = atoi(argv[2]); uint32_t insert = atoi(argv[3]); size_t len = 0; if (load_file(file_name, &content, &len) < 0) { printf("load %s failed\n", file_name); return -1; } std::string raw_content(content, len); for (int i = 0; i < space - 1 ; i++) { raw_content.append(content, len); } char size_str[64]; 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 == 0 ) { raw_content.insert(0, final_content); } if (insert == 1) { final_content.append(raw_content); } if (insert == 2) { char* buf = (char*)malloc(final_content.size() + raw_content.size() + 1); memcpy(buf, final_content.c_str(), final_content.size()); memcpy(buf + final_content.size(), raw_content.c_str(), raw_content.size()); free(buf); } } return 0; }
性能测试显示
可以看到在insert移动文本长度在k 级别以上时,其效率较拷贝的效率高得多。
由于涉及到内存分配,方案3的效率最低。
方案1 和方案2 的性能差别应该以上由于方案二分配了大量的(标红处)内存空间,gcc的代码如下
标签:style blog http io ar color os sp for
原文地址:http://www.cnblogs.com/westfly/p/4155955.html