热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C++字符串连接速度测试

C字符串连接速度测试测试函数“memcpy”,“strcat”,“strcpy”,“sprintf”,“string::operator”,“std::stringstream
C++ 字符串连接速度测试

测试函数

“memcpy”, “strcat”, “strcpy”, “sprintf”, “string::operator+”, “std::stringstream”

测试结果

连接10万次,使用是clock,单位应该是毫秒
======test begin=
memcpy cost:0
strcat cost:453
strcpy cost:440
sprintf cost:547
string::operator+=() cost:19
stringstream cost:34
======test end=

测试代码

测试代码里,对于memcpy, strcat, strcpy, sprintf,由于每次连接后,故意把指针指向了未端,所以实际应用中,strcat,strcpy, sprintf 会真的非常慢

std::cout <<std::endl<< "&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;test begin&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;" << std::endl;const int testCount &#61; 100000;const char* test_str &#61; "test";clock_t startTime, endTime;const std::size_t test_str_count &#61; strlen(test_str);const std::size_t buf_size &#61; testCount * test_str_count;int cur_size &#61; buf_size;char* cur_buf &#61; NULL;const int fun_count &#61; 4;int clock_res[] &#61; { 0, 0, 0, 0 };std::string name[] &#61; {"memcpy", "strcat", "strcpy", "sprintf", "string::operator&#43;", "std::stringstream"};// memcpychar* mem_buf &#61; new char[buf_size&#43;1];startTime &#61; clock();char* cur_mem_buf &#61; mem_buf;cur_size &#61; buf_size;std::size_t mem_size &#61; test_str_count * sizeof(char);for (int i &#61; 0; i < testCount; i&#43;&#43;) {memcpy(cur_mem_buf, test_str, test_str_count);cur_mem_buf &#43;&#61; test_str_count;//cur_size -&#61; test_str_count;}mem_buf[buf_size] &#61; &#39;\0&#39;;endTime &#61; clock();std::cout << "memcpy cost:" << (double)(endTime - startTime) << std::endl;delete[] mem_buf;// strcatchar* cat_buf &#61; new char[buf_size &#43; 1];startTime &#61; clock();*cat_buf &#61; &#39;\0&#39;;cur_buf &#61; cat_buf;cur_size &#61; buf_size&#43;1;for (int i &#61; 0; i < testCount; i&#43;&#43;) {strcat_s(cur_buf, cur_size, test_str);cur_buf &#43;&#61; test_str_count;cur_size -&#61; test_str_count;}endTime &#61; clock();std::cout << "strcat cost:" << (double)(endTime - startTime) << std::endl;delete[] cat_buf;// strcpychar* cpy_buf &#61; new char[buf_size &#43; 1];startTime &#61; clock();cur_buf &#61; cpy_buf;cur_size &#61; buf_size&#43;1;for (int i &#61; 0; i < testCount; i&#43;&#43;) {strcpy_s(cur_buf, cur_size, test_str);cur_buf &#43;&#61; test_str_count;cur_size -&#61; test_str_count;}cpy_buf[buf_size] &#61; &#39;\0&#39;;endTime &#61; clock();std::cout << "strcpy cost:" << (double)(endTime - startTime) << std::endl;delete[] cpy_buf;// sprintfchar* test_buf &#61; new char[buf_size&#43;1];startTime &#61; clock();test_buf[0] &#61; &#39;\0&#39;;char* cur_p &#61; test_buf;cur_size &#61; buf_size&#43;1;for (int i &#61; 0; i < testCount; i&#43;&#43;) {int cur_c &#61; i * test_str_count;sprintf_s(cur_p, cur_size, "%s", test_str);cur_p &#43;&#61; test_str_count;cur_size -&#61; test_str_count;}endTime &#61; clock();std::cout << "sprintf cost:" << (double)(endTime - startTime) << std::endl;delete[] test_buf;// &#43;startTime &#61; clock();std::string str;for (int i &#61; 0; i < testCount; i&#43;&#43;) {str &#43;&#61; test_str;}endTime &#61; clock();std::cout << "string::operator&#43;&#61;() cost:" << (double)(endTime - startTime) << std::endl;// stringstreamstartTime &#61; clock();std::stringstream strstr;for (int i &#61; 0; i < testCount; i&#43;&#43;) {strstr << "test ";}endTime &#61; clock();std::cout << "stringstream cost:" << (double)(endTime - startTime) << std::endl;std::cout << "&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;test end&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;" << std::endl;


推荐阅读
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • WinMain 函数详解及示例
    本文详细介绍了 WinMain 函数的参数及其用途,并提供了一个具体的示例代码来解析 WinMain 函数的实现。 ... [详细]
  • 本文介绍如何使用线段树解决洛谷 P1531 我讨厌它问题,重点在于单点更新和区间查询最大值。 ... [详细]
  • oracle c3p0 dword 60,web_day10 dbcp c3p0 dbutils
    createdatabasemydbcharactersetutf8;alertdatabasemydbcharactersetutf8;1.自定义连接池为了不去经常创建连接和释放 ... [详细]
  • 本文探讨了C语言和C++中大小写的处理方式,并详细介绍了如何在C++中实现不区分大小写的字符串比较。通过自定义`char_traits`类,可以灵活地处理字符的比较、复制和转换。 ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • 本文详细介绍了C语言中常用的字符串处理函数,包括字符串比较、拷贝、拼接和求长度等,这些函数均在string.h头文件中定义。 ... [详细]
  • 字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流
    字节流抽象类InputStream和OutputStream是字节流的顶级父类所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStreamInput ... [详细]
  • poj 3352 Road Construction ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • 2.2 组件间父子通信机制详解
    2.2 组件间父子通信机制详解 ... [详细]
  • 在C#中,一旦对象被实例化后,直接重新调用构造函数是不可行的。与C++不同,C#不支持在对象实例化后强制调用构造函数。为了实现类似的功能,可以通过定义一个重置方法或使用工厂模式来重新初始化对象的状态。例如,可以创建一个 `Reset` 方法,在该方法中重新设置对象的属性和状态,从而达到类似于重新调用构造函数的效果。这样不仅保持了代码的清晰性和可维护性,还避免了潜在的副作用。 ... [详细]
  • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
  • Spring框架中枚举参数的正确使用方法与技巧
    本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
  • 题目解析给定 n 个人和 n 种书籍,每个人都有一个包含自己喜好的书籍列表。目标是计算出满足以下条件的分配方案数量:1. 每个人都必须获得他们喜欢的书籍;2. 每本书只能分配给一个人。通过使用深度优先搜索算法,可以系统地探索所有可能的分配组合,确保每个分配方案都符合上述条件。该方法能够有效地处理这类组合优化问题,找到所有可行的解。 ... [详细]
author-avatar
悠闲的大黄
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有