utf8 <-> utf16:codecvt 性能不佳

2024-01-31

我正在研究一些旧的(并且专门面向 win32 的)东西,并考虑使其更加现代/可移植 - 即在 C++11 中重新实现一些广泛可重用的部分。其中之一是 utf8 和 utf16 之间的转换。在我使用的 Win32 API 中MultiByteToWideChar/WideCharToMultiByte,尝试使用此处的示例代码将这些内容移植到 C++11:https://stackoverflow.com/a/14809553 https://stackoverflow.com/a/14809553。结果是

发布版本(由MSVS 2013编译,在Core i7 3610QM上运行)

stdlib                   = 1587.2 ms
Win32                    =  127.2 ms

调试构建

stdlib                   = 5733.8 ms
Win32                    =  127.2 ms

问题是- 代码有问题吗?如果一切似乎都正常——这种性能差异有什么充分的理由吗?

测试代码如下:

#include <iostream>
#include <fstream>
#include <string>
#include <iterator>
#include <clocale>  
#include <codecvt> 

#define XU_BEGIN_TIMER(NAME)                       \
    {                                           \
        LARGE_INTEGER   __freq;                 \
        LARGE_INTEGER   __t0;                   \
        LARGE_INTEGER   __t1;                   \
        double          __tms;                  \
        const char*     __tname = NAME;         \
        char            __tbuf[0xff];           \
                                                \
        QueryPerformanceFrequency(&__freq);     \
        QueryPerformanceCounter(&__t0);         

#define XU_END_TIMER()                             \
        QueryPerformanceCounter(&__t1);         \
        __tms = (__t1.QuadPart - __t0.QuadPart) * 1000.0 / __freq.QuadPart; \
        sprintf_s(__tbuf, sizeof(__tbuf), "    %-24s = %6.1f ms\n", __tname, __tms ); \
        OutputDebugStringA(__tbuf);             \
        printf(__tbuf);                         \
    }   

std::string read_utf8() {
    std::ifstream infile("C:/temp/UTF-8-demo.txt");
    std::string fileData((std::istreambuf_iterator<char>(infile)),
                         std::istreambuf_iterator<char>());
    infile.close();

    return fileData;
}

void testMethod() {
    std::setlocale(LC_ALL, "en_US.UTF-8");
    std::string source = read_utf8();
    {
        std::string utf8;

        XU_BEGIN_TIMER("stdlib") {
            for( int i = 0; i < 1000; i++ ) {
                std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> convert2utf16;
                std::u16string utf16 = convert2utf16.from_bytes(source);

                std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> convert2utf8;
                utf8 = convert2utf8.to_bytes(utf16);
            }
        } XU_END_TIMER();

        FILE* output = fopen("c:\\temp\\utf8-std.dat", "wb");
        fwrite(utf8.c_str(), 1, utf8.length(), output);
        fclose(output);
    }

    char* utf8 = NULL;
    int cchA = 0;

    {
        XU_BEGIN_TIMER("Win32") {
            for( int i = 0; i < 1000; i++ ) {
                WCHAR* utf16 = new WCHAR[source.length() + 1];
                int cchW;
                utf8 = new char[source.length() + 1];

                cchW = MultiByteToWideChar(
                    CP_UTF8, 0, source.c_str(), source.length(),
                    utf16, source.length() + 1);

                cchA = WideCharToMultiByte(
                    CP_UTF8, 0, utf16, cchW,
                    utf8, source.length() + 1, NULL, false);

                delete[] utf16;
                if( i != 999 )
                    delete[] utf8;
            }
        } XU_END_TIMER();

        FILE* output = fopen("c:\\temp\\utf8-win.dat", "wb");
        fwrite(utf8, 1, cchA, output);
        fclose(output);

        delete[] utf8;
    }
}

在我自己的测试中,我发现构造函数调用wstring_convert至少在 Windows 上有巨大的开销。正如其他答案所暗示的那样,您可能会很难击败本机 Windows 实现,但请尝试修改代码以在循环外部构造转换器。我预计您会看到 5 倍到 20 倍的改进,特别是在调试版本中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

utf8 <-> utf16:codecvt 性能不佳 的相关文章

  • 如果两个线程同时访问同一个 bool 变量会发生什么?

    我有一个跨平台 C 程序 其中使用 boost 库创建异步计时器 我有一个全局变量 bool receivedInput false 一个线程等待并处理输入 string argStr while 1 getline cin argStr
  • C# 测试活动的互联网连接。 Ping google.com

    C 2008 我正在使用此代码来测试互联网连接 因为我的应用程序必须登录到网络服务器 但是 如果用户互联网连接失败或电缆被拔出 我必须通知用户 Ping www google com to check if the user has a i
  • 在目标 VS 安装时,VSIX 扩展内部使用的 WPF-Log4Net 未输出日志

    当 Log4net 在 VSIX 扩展中使用并安装在另一个目标 VS 上时 它不会记录日志 我有一个 WPF 解决方案 我下载了 log4net dll 添加了 log4net config 并将 复制到输出目录 值设置为 始终复制 log
  • std::tr1::function 和 std::tr1::bind

    我在使用时遇到问题veryC 类中的复杂 C 函数 重写 C 函数是not一个选项 C函数 typedef void integrand unsigned ndim const double x void fdata unsigned fd
  • numpy 数组最快的保存和加载选项

    我有一个生成二维的脚本numpy数组与dtype float和形状的顺序 1e3 1e6 现在我正在使用np save and np load对数组执行 IO 操作 然而 这些函数对于每个数组都需要几秒钟的时间 是否有更快的方法来保存和加载
  • EF Core 一对多关系列表返回 null

    我正在尝试学习如何在 EF Core 中正确利用 DbContext 我有一个团队课程 public class Team public int ID get set public string Name get set public bo
  • 为什么我的 CAOpenGLLayer 更新速度比之前的 NSOpenGLView 慢?

    我有一个在 Mac OS X 上渲染 OpenGL 内容的应用程序 最初它渲染到 NSOpenGLView 然后我将其更改为渲染到 CAOpenGLLayer 子类 当我这样做时 我看到了巨大的性能损失 帧速率减半 鼠标响应能力降低 卡顿
  • 三种 System.Drawing 方法表现出缓慢的绘制或闪烁:解决方案?或其他选择?

    我正在通过 System Drawing 进行一些绘图 但遇到了一些问题 我将数据保存在队列中 并将该数据绘制 绘制 到三个图片框中 此方法填充图片框 然后滚动图形 所以不要在以前的绘图上绘制 并且逐渐看起来更混乱 我找到了两种绘制图表的解
  • 将授权标头添加到 Web 参考

    我正在尝试向客户端的网络服务发出请求 我不知道客户端的底层平台 我使用 添加 Web 引用 在 Visual Studio 2010 中使用了客户端的 WSDL 并生成了我的代理类 称为 ContactService 我现在需要将如下所示的
  • 我可以对(非成员)函数使用部分模板特化吗?

    我试图在 非成员 函数上使用部分模板专业化 但我在语法上遇到了问题 我在 StackOverflow 中搜索了其他部分模板专业化问题 但这些问题涉及类或成员函数模板的部分专业化 作为起点 我有 struct RGBA RGBA uint8
  • Request.Form 和 Request.QueryString 之间的区别?

    有人可以告诉我两者之间的确切区别吗Request Form and Request QueryString 我知道一个区别 比如 如果HTTP请求方式为POST 则用户提交的数据在申请表 收藏 如果HTTP请求方法是GET 则用户提交的数据
  • 如何组合||条件语句中的运算符[重复]

    这个问题在这里已经有答案了 代替 if foo 1 foo 5 foo 9 我喜欢将它们组合起来 类似于以下内容 这不起作用 if foo 1 5 9 那可能吗 不幸的是不是 你最好的选择是创建一个扩展方法 public static bo
  • 如何创建和使用类箭头运算符? [复制]

    这个问题在这里已经有答案了 因此 在到处研究之后 我似乎找不到如何创建类箭头运算符 即 class Someclass operator gt 我只需要知道如何使用它并正确使用它 它的输入是什么 它返回什么 我如何正确地声明 原型化它 运算
  • C# 3.0 中自动属性和公共字段的区别

    我无法理解为什么 C 3 0 中存在自动实现的属性语言功能 当你说的时候有什么区别 public string FirstName than public string FirstName get set 因为它们在生成的 IL 代码 和机
  • 在Framework 4.6项目中使用.net core DLL

    我已经在 net core 2 0 中构建了一个 DLL 现在我想在使用 net 4 6 1 框架的 WinForms 项目中使用它 我可以引用该 dll 但收到 System IO FileLoadException 表示找不到 Syst
  • 是否可以编写一个在另一个 Windows 应用程序中选择文本时收到通知的 Windows 应用程序?

    我很好奇是否可以编写一个程序来监视我的文本选择 一种可能的用途是编写一个与编辑器 IDE 无关的代码格式化程序 应用程序 服务 P 启动并以某种方式挂接到窗口中 以便在任何窗口中选择文本时收到通知 启动其他一些应用程序 A 用户选择 A 中
  • char[length]初始化并处理

    我定义了一个字符数组 char d 6 如果我在以下方面有误 请纠正我 此时没有为变量分配内存d 现在我要初始化它 d aaaaa 这种初始化之后 就不需要释放内存了 它将自动完成 我怎么知道是否char 被初始化了吗 我正在寻找类似的模式
  • 替换全局热键

    我有一个位于托盘中的应用程序 我想定义多个热键来触发我的程序中的事件 我从 AaronLS 在这个问题中的出色回答中找到了灵感 使用C 设置全局热键 https stackoverflow com a 27309185 3064934 如果
  • asp.net mvc GET 请求上的 formcollection 应该为空

    我正在发布一个简单的操作 public void Login FormCollection formCollection 即使查询字符串值很少 formcollection Count is 0 是靠行为吗 FormCollection 使
  • C#:如何处理乱序 TCP 数据包?

    请有人解释一下如何处理乱序数据包 我使用原始套接字来捕获数据包 并在数据包到来时解析它们 但其中一些数据包的顺序错误 例如 ID 标志 16390 PSH ACK 16535 PSH ACK 16638 确认 16640 PSH ACK 1

随机推荐

  • 仅保存 Outlook 邮件项目的真实附件

    我目前正在开发一个 Outlook 插件 它将邮件项目和附件保存在我的 MSSQL 数据库中 我有一个方法可以保存 MailItem 及其所有附件 但是 如果我保存所有附件 则 MailItem 中的嵌入图像也会保存 有谁知道如何拯救所有r
  • 使用JPA2时如何对EJB进行单元测试?

    您将如何对使用 JPA 的 EJB 进行单元测试 例如 如果我有一个 Order 实体和 OrderEJB 它应该计算订单总数 如下定义 我将如何在不接触数据库的情况下对 EJB 进行单元测试 另外 您将如何定义实体的值 以便可以断言预期的
  • 如何在 MPMoviePlayerController 中显示字幕

    我构建了一个自定义视频播放器 所有按钮都可以使用 我需要知道当视频具有该选项时 MPMoviePlayerController 显示字幕的代码是什么 我没有在任何地方找到示例或知道该字幕按钮背后的代码的人 我在哪里可以找到这个 您将必须实现
  • Eclipse 找不到我的 Android 4.1.2 设备

    我正在尝试仅运行介绍 Hello World 我的手机 Droid Razr Maxx 上的应用程序正在使用 Eclipse 运行 android 4 1 2 jelly bean 我启用了 USB 调试 尝试更新手机驱动程序 重新安装驱动
  • 如何在 Python (2.6) 中将 JSON 解码为 str 而不是 unicode? [复制]

    这个问题在这里已经有答案了 我有一个 JSON 格式的配置文件 其中包含一些字符串变量 始终为 ascii 这些字符串默认解码为 un icode 但由于我必须将这些变量传递给我的 Python C 扩展 所以我需要它们作为普通的 Pyth
  • 我可以在 Javascript 中抛出异常来停止 Javascript 执行吗?

    我尝试模拟一个问题 从外部 url 加载的脚本会停止执行我的网站上的任何其他脚本 我尝试通过调用不退出的函数来模拟这样的问题 我可以在 firebug 中看到错误 但页面上的不同脚本仍然执行 JavaScript 中是否存在不同类型的错误
  • 8086 汇编中的大二进制移位?

    我有一个 512 字节长的二进制数据块 我想知道如果我想将其右移一次 最有效的方法是什么 我现在最好的猜测 对于汇编来说非常新 是我必须首先检查一个块 可能是 int 看看它将移出什么 移出 然后携带先前 int 移出的任何内容并继续携带这
  • Java:如何计算从InputStream读取的字节数而不事先分配完整内存

    我有一个 Java 后端 用户可以将文件上传到其中 我想将这些上传的文件限制为最大大小 并希望在上传时检查上传的字节数 并在达到限制后立即中断传输 目前 我在分配之前使用 InputStream available 来确定估计大小 但这似乎
  • 在 Elixir 中引用管道值

    我想计算字符串中单词出现的次数 实现是有问题的 但让我们用它来演示我的问题 def count sentence do words String split sentence occurrences Enum map words fn w
  • python read() 从 stdout 比逐行读取慢得多(啜饮?)

    我有一个 python SubProcess 调用 它运行一个可执行文件并将输出通过管道传输到我的子进程标准输出 在 stdout 数据相对较小 约 2k 行 的情况下 逐行读取和作为块读取 stdout read 之间的性能相当 其中 s
  • 使用 Select-String 在 powershell 中检查两个 .txt 文件

    我对编写 powershell 脚本完全陌生 到目前为止 我使用普通批次来达到我的目的 因为这是我公司的要求 在此批处理中 我使用嵌套的 foo 循环来比较两个 txt 文件 具体来说 我想要执行以下操作 文件 1 包含大量字符串 每个字符
  • 我可以保留“未使用的CSS选择器”吗?

    我注意到 svelte 会自动清除我的 css 所有 未使用的 css 选择器 都将被删除 例如 p class blue This is a paragraph p 红色 类的样式将被删除 如何保留 blue 选择器 我想稍后某个时候使用
  • 在大屏幕上将 n-div 放在一起,在小屏幕上将 n-div 放在彼此下面

    我正在努力实现这个效果 如果屏幕足够大 我想将 n div 彼此相邻放置 否则将一个放在彼此下方 并且我希望将这些 n div 包含在一个 div 中 我的代码中的黄色容器 和标题区域 在我的代码中为黑色 封装所有内容的包装器中的黄色容器
  • XSL 交叉引用

    我现在正在学习 XSL 有一个关于交叉引用的问题 我的目标 XML 文件的结构如下
  • Android 列表视图中的滚动是如何工作的?

    我有一个 android 应用程序 在活动中有一个列表视图 如果我这么称呼的话 列表视图具有三种数据状态 没有从 inet 加载数据 gt 只有一个虚拟项可见 表示正在加载数据 数据已加载并显示在列表中 单击一个列表项 现在显示该列表项的更
  • 如何使用OpenRowSet向空白文件中插入数据?

    如何使用开放行集将数据插入空白文件 我需要在 txt 文件 例如 D TDB 中插入一些选择输出 例如select from sys tables 来自数据库 INSERT INTO OPENROWSET Microsoft Jet OLE
  • mysql查询中日期时间差的总和

    Mysql表的列是 Starttime type datetime Stoptime type datetime Data Starttime stoptime 2013 10 25 09 00 00 2013 10 25 17 00 00
  • 可以知道一个字符串是否是用base64编码的吗?

    就那么简单 我正在制作一个应用程序 用户必须扫描 QR 码 基本上是 Base64 编码的字符串 有什么方法可以在解码之前验证该字符串是否以 Base64 编码并遵循应用程序的流程 我的代码负责的是 func captureOutput c
  • 在 SiteEdit 2009 中加载页面时出现“无法从组件 xml 架构获取类型信息”

    我使用此处给出的答案在 SitEdit 2009 SP2 上启用了内联编辑 使用 XSLT TBB 时如何在 SiteEdit 中启用内联字段编辑 https stackoverflow com questions 9667640 how
  • utf8 <-> utf16:codecvt 性能不佳

    我正在研究一些旧的 并且专门面向 win32 的 东西 并考虑使其更加现代 可移植 即在 C 11 中重新实现一些广泛可重用的部分 其中之一是 utf8 和 utf16 之间的转换 在我使用的 Win32 API 中MultiByteToW