将lua与区域设置隔离 我考虑将Lua嵌入到FreeBSD 8.2下运行的C++应用程序中。但基准测试显示在某些情况下表现不佳。特别是当Lua试图将字符串转换为数字并比较字符串时,它会变得更慢,更糟糕,8核的性能比1核差!。我现在认为这是语言环境,因为当我避免自动转换时,一切都很好。但在现实生活中,我需要字符串比较和数字转换。我怎样才能:

将lua与区域设置隔离 我考虑将Lua嵌入到FreeBSD 8.2下运行的C++应用程序中。但基准测试显示在某些情况下表现不佳。特别是当Lua试图将字符串转换为数字并比较字符串时,它会变得更慢,更糟糕,8核的性能比1核差!。我现在认为这是语言环境,因为当我避免自动转换时,一切都很好。但在现实生活中,我需要字符串比较和数字转换。我怎样才能:,lua,locale,Lua,Locale,将Lua与区域设置隔离,即确保Lua的任何函数都不会间接使用区域设置。例如,我可以提供自己的转换和比较功能吗 或者完全禁用区域设置。我试过设置语言环境LC_ALL,C,它工作正常,语言环境改变,但瓶颈仍然存在 更新: 根据lhf的建议,我直接进入了Lua库代码。我发现有几十个地方使用了官方语言环境相关的函数。要想把它们全部清除,需要付出太多的努力,必须有更好的方法。我试着测量它们中的哪一个不成比例。我还添加了一些其他常用函数,以及一些我自己感兴趣的Lua解释器的创建和销毁、设置全局变量等。正确的

将Lua与区域设置隔离,即确保Lua的任何函数都不会间接使用区域设置。例如,我可以提供自己的转换和比较功能吗

或者完全禁用区域设置。我试过设置语言环境LC_ALL,C,它工作正常,语言环境改变,但瓶颈仍然存在

更新:

根据lhf的建议,我直接进入了Lua库代码。我发现有几十个地方使用了官方语言环境相关的函数。要想把它们全部清除,需要付出太多的努力,必须有更好的方法。我试着测量它们中的哪一个不成比例。我还添加了一些其他常用函数,以及一些我自己感兴趣的Lua解释器的创建和销毁、设置全局变量等。正确的百分比必须为700%,即7个线程的性能必须是1个线程的7倍:

           nop:  824%  (1:106867300/7:881101495)
    sprintf %f:   57%  (1:2093975/7:1203949)
 sprintf %.14g:   51%  (1:2503818/7:1278312)
sprintf %.14lf:   73%  (1:2134432/7:1576657)
   sprintf %lf:   64%  (1:2083480/7:1340885)
    sprintf %d:  601%  (1:6388005/7:38426161)
     sscanf %s:  181%  (1:8484822/7:15439285)
     sscanf %f:  712%  (1:3722659/7:26511335)
     lua_cycle:  677%  (1:113483/7:768936)
    set_global:  715%  (1:1506045/7:10780282)
set_get_global:  605%  (1:2814992/7:17044081)
       strcoll:  670%  (1:38361144/7:257300597)
        getenv:  681%  (1:8526168/7:58131030)
       isdigit:  695%  (1:106894420/7:743529202)
       isalpha:  662%  (1:80771002/7:535055196)
    isalpha(r):  638%  (1:78232353/7:499207555)
        strtol:  694%  (1:16865106/7:117208528)
        strtod:  749%  (1:16727244/7:125323881)
          time:  168%  (1:727666/7:1225499)
  gettimeofday:  162%  (1:727549/7:1183433)
运行期间的数据会有所变化,但总体情况保持一致:sprintf双线程转换的性能比单线程更差。一天中的时间和时间比例很差。带有%s的sscanf也不能很好地扩展,这是非常令人惊讶的,但在我的例子中这不是一个问题

最后,它可能根本就不是语言环境。我将Lua转换从sprintf更改为一些简化的手工代码,到目前为止一切正常


顺便说一句,第一个基准测试是在linux桌面上运行的,并没有显示出如此奇怪的东西。我对它的FreeBSD行为感到惊讶。

为了避免字符串比较中的区域设置,请在lvm.c中将strcoll更改为strcmp。要避免字符串到数字转换中的区域设置,请更改luaconf.h中lua_str2number的定义以避免strod。但是请注意,提供您自己的strod并非易事。您还可以删除llex.c中的trydecpoint

所以,它根本不是本地的?如果你在Lua核心中做了什么改变呢?我将定义Lua_编号2strs,n sprintfs,Lua_编号\u FMT,n更改为我的格式\u双s,n。不确定它是否是区域设置,但它位于sprintf%lf中。