• 工资「喂饱肚子」,副业「养活灵魂」!

  • 本站会放置Google广告用于维持域名以及网站服务器费用。

  • 感谢大家访问本站,希望本站的内容可以帮助到大家!

  • 如果觉得本站的内容有帮助,可以考虑打赏博主哦!

  • 欢迎大家交换友链,可在https://www.stubbornhuang.com/申请友情链接进行友链交换申请!

  • 问题反馈可发送邮件到stubbornhuang@qq.com

  • 在本站开通年度VIP,无限制下载本站资源和阅读本站文章

  • 本站由于前段时间遭受到大量临时和国外邮箱注册,所以对可注册的邮箱类型进行了限制!

  • 计算机图形学与计算几何经典必备书单整理,下载链接可参考:https://www.stubbornhuang.com/1256/

C++11 – 使用std::codecvt进行字符编码转换需要注意的时间效率问题

C++ 发布于2021-12-21 阅读 5,604次 0次评论 2次点赞 本文共2352个字,阅读需要6分钟。

1 使用std::codecvt进行Unicode转UTF8字符编码的时间效率测试

通常情况下,使用std::codecvt进行Unicode转UTF8编码会使用以下的函数:

std::string Std_UnicodeToUTF8(const std::wstring& unicodeStr)
{
    std::string ret;
    try
    {
        std::wstring_convert< std::codecvt_utf8<wchar_t> > unicode_to_utf8_conv;
        ret = unicode_to_utf8_conv.to_bytes(unicodeStr);
    }
    catch (const std::exception& e)
    {

    }
    return ret;
}

我所使用的测试时间效率的代码如下:

#include <iostream>
#include <string>
#include <codecvt>
#include <chrono>

std::string Std_UnicodeToUTF8(const std::wstring& unicodeStr)
{
    std::string ret;
    try
    {
        std::wstring_convert< std::codecvt_utf8<wchar_t> > unicode_to_utf8_conv;
        ret = unicode_to_utf8_conv.to_bytes(unicodeStr);
    }
    catch (const std::exception& e)
    {

    }
    return ret;
}


int main()
{
    auto beforeTime = std::chrono::steady_clock::now();

    std::wstring unicodeStr = L"我爱你中国我爱你中国我爱你中国我爱你中国我爱你中国我爱你中国我爱你中国我爱你中国我爱你中国我爱你中国我爱你中国我爱你中国";

    for (int i = 0; i < 5000; ++i)
    {
        std::string utf8 = Std_UnicodeToUTF8(unicodeStr);
    }


    auto afterTime = std::chrono::steady_clock::now();
    double duration_millsecond = std::chrono::duration<double, std::milli>(afterTime - beforeTime).count();
    std::cout << "Unicode转utf8耗时:" << duration_millsecond << "毫秒" << std::endl;
}

做5000次Unicode编码转UTF8编码字符串转换,上述代码在测试机上Debug耗时:944.763ms,Release耗时167.571ms。这个结果出来,我人都麻了,这个转换效率太慢了。

2 编码转换时间效率低的原因

经过观察代码我们发现,每调用一次Std_UnicodeToUTF8函数就要新建一个std::wstring_convert< std::codecvt_utf8 >对象,是不是这个对象创建过程十分耗时?不如换成static类型试一试。

3 换成static对象后的测试代码

#include <iostream>
#include <string>
#include <codecvt>
#include <chrono>

std::string Std_UnicodeToUTF8(const std::wstring& unicodeStr)
{
    std::string ret;
    try
    {
        static std::wstring_convert< std::codecvt_utf8<wchar_t> > unicode_to_utf8_conv;
        ret = unicode_to_utf8_conv.to_bytes(unicodeStr);
    }
    catch (const std::exception& e)
    {

    }
    return ret;
}


int main()
{
    auto beforeTime = std::chrono::steady_clock::now();

    std::wstring unicodeStr = L"我爱你中国我爱你中国我爱你中国我爱你中国我爱你中国我爱你中国我爱你中国我爱你中国我爱你中国我爱你中国我爱你中国我爱你中国";

    for (int i = 0; i < 5000; ++i)
    {
        std::string utf8 = Std_UnicodeToUTF8(unicodeStr);
    }


    auto afterTime = std::chrono::steady_clock::now();
    double duration_millsecond = std::chrono::duration<double, std::milli>(afterTime - beforeTime).count();
    std::cout << "Unicode转utf8耗时:" << duration_millsecond << "毫秒" << std::endl;
}

做5000次Unicode编码转UTF8编码字符串转换,上述代码在测试机上Debug耗时:104.362ms,Release耗时7.236ms。经过测试结果上看,修改为静态对象,在每次调用Std_UnicodeToUTF8函数时都是调用静态对象,而不是重新创建,这节省了巨大的时间开销。

对于高并发C++服务器,一般http请求为了节省带宽都是使用utf8编码,而C++业务服务器内部为国际化或者有处理中文字符串的需求,一般情况下会使用Unicode编码,所以在每一次请求时都需要进行UTF8->Unicode,Unicode->UTF8的转换,这就要求这个转换过程必须要快速。所以,请合理使用std::codecvt。

欢迎扫码关注我的微信公众号,及时获取文章更新

微信公众号二维码

本文作者:StubbornHuang

版权声明:本文为站长原创文章,如果转载请注明原文链接!

原文标题:C++11 – 使用std::codecvt进行字符编码转换需要注意的时间效率问题

原文链接:https://www.stubbornhuang.com/1867/

发布于:2021年12月21日 14:30:12

修改于:2023年06月26日 20:55:45

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

文章末尾
上一篇
计算机图形学 - 常用的3D数学知识备忘,如三角函数、向量运算、矩阵运算、图形学常用的平移缩放旋转矩阵,视图矩阵,投影矩阵
3D数学基础
下一篇
Pytorch - 一文搞懂如何使用Pytorch构建与训练自定义深度学习网络(数据集自定义与加载,模型训练,模型测试,模型保存与加载)
Pytorch
当前分类随机文章推荐

发表评论

您必须 [ 登录 ] 才能发表留言!

关注我们的公众号

微信公众号