IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> C++标准库中string类遍历方式的性能差距 -> 正文阅读

[开发工具]C++标准库中string类遍历方式的性能差距

没有废话,直接上测试代码

#include <chrono>
#include <string>
#include <iostream>
#include <functional>

using namespace std;
using namespace chrono;

static uint64_t size = 12550820;
static string test_str(size, 'S');

uint64_t test(function<void()>& target) {
    auto time_begin = system_clock::now();
    target();
    auto time_end = system_clock::now();
    return static_cast<uint64_t>(duration_cast<microseconds>(time_end - time_begin).count());
}

int main() {
    std::function<void()> for_f = []()->void{
        uint64_t test = 0;
        for(char mychar : test_str) {
            test++;
        }
    };
    
    std::function<void()> normal_iterator_f = []()->void{
        uint64_t test = 0;
        for(auto i = test_str.begin(); i != test_str.end(); i++) {
            test++;
        }
    };
    
    std::function<void()> reverse_iterator_f = []()->void{
        uint64_t test = 0;
        for(auto i = test_str.rbegin(); i != test_str.rend(); i++) {
            test++;
        }
    };
    
    std::function<void()> const_iterator_f = []()->void{
        uint64_t test = 0;
        for(string::const_iterator i = test_str.begin(); i != test_str.end(); i++) {
            test++;
        }
    };
    
    std::function<void()> normal_cstyle_f = []()->void{
        uint64_t test = 0;
        char* char_ptr = const_cast<char*>(test_str.c_str());
        for(uint64_t i = 0; i < test_str.size(); i++) {
            char_ptr++;
            test++;
        }
    };
    
    std::function<void()> reverse_cstyle_f = []()->void{
        uint64_t test = 0;
        char* char_ptr = const_cast<char*>(test_str.c_str());
        char_ptr += test_str.size();
        for(uint64_t i = 0; i < test_str.size(); i++) {
            char_ptr--;
            test++;
        }
    };
    
    std::function<void()> index_f = []()->void{
        uint64_t test = 0;
        char mychar;
        for(uint64_t i = 0; i < test_str.size(); i++) {
            test++;
            mychar = test_str[i];
        }
    };
    
    cout << "(单位:毫秒)" << endl;
    cout << "标准for遍历用时 \t" << test(for_f) << endl;
    cout << "标准iterator用时 \t" << test(normal_iterator_f) << endl;
    cout << "反向iterator用时 \t" << test(reverse_iterator_f) << endl;
    cout << "常量iterator用时 \t" << test(const_iterator_f) << endl;
    cout << "标准C风格遍历用时 \t" << test(normal_cstyle_f) << endl;
    cout << "反向C风格遍历用时 \t" << test(reverse_cstyle_f) << endl;
    cout << "下标访问用时 \t" << test(index_f) << endl;
    
    return 0;
}

运行结果

~/build $ g++ 
~/app/potato/worldbox/util/speedtest.cc                                                     
~/build $ ./a.out                                                                                         
(单位:毫秒)                                                                                               
标准for遍历用时         475926                                                                            
标准iterator用时        1530713                                                                           
反向iterator用时        1503410                                                                           
常量iterator用时        1529692                                                                           
标准C风格遍历用时       537057                                                                            
反向C风格遍历用时       536231                                                                            
下标访问用时    1058003                                                                                   
~/build $
  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2021-11-29 16:30:44  更:2021-11-29 16:31:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 17:22:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码