Pebble Coding

ソフトウェアエンジニアによるIT技術、数学の備忘録

std::string_viewはstd::stringに比べてどのくらい速いのか

std::string_viewは文字列の所有権を保持しません。
所有権を保持しない文字列であればcharポインタを使った方が効率はいいです。
std::string_viewには文字列比較機能などがありますが所有権を持たせたくなった時に、
std::stringに変更した時の修正量が少なくて済むというメリットがあります。
内部的にはメンバ変数としてcharポインタとsize_tを持っているだけのようです。
もう一つのstd::stringとの大きな違いとしてはstd::string_viewはnullptrを受け取ることができます。
このときはcharポインタにはnullptrが入り、size_tには0が入ります。
判定には、size(), length(), empty(), data()などが利用できるようです。
std::string_viewはstd::stringに比べてどのくらい速いのか調べてみました。

#include <chrono>
#include <stdio.h>
#include <vector>
#include <string>
#include <string_view>

int main(int argc, const char * argv[]) {
    
    const auto bufsize = 16;
        
    std::vector<std::string> original;
    original.reserve(1000 * 1000);
    
    for (int i = 0; i < 10000; ++i) {
        char buf[bufsize];
        snprintf(buf, sizeof(buf), "%d", i);
        original.push_back(buf);
    }
    
    {
        std::vector<std::string_view> v;
        v.reserve(1000 * 1000);
        
        const auto begin = std::chrono::system_clock::now();
        for (int i = 0; i < 10000; ++i) {
            v.push_back(std::string(original[i]));
        }
        
        const auto end = std::chrono::system_clock::now();
        const auto duration = std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin).count();
        printf("%lld\n", duration);
    }
    
    {
        std::vector<std::string_view> v;
        v.reserve(1000 * 1000);
        
        const auto begin = std::chrono::system_clock::now();
        for (int i = 0; i < 10000; ++i) {
            v.push_back(std::string_view(original[i]));
        }
        
        const auto end = std::chrono::system_clock::now();
        const auto duration = std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin).count();
        printf("%lld\n", duration);
    }
        
    return 0;
}

34000
21000

1.6倍ほど速いという結果になりました。