从语言环境中隔离lua

时间:2011-04-25 13:51:37

标签: lua locale

我正在考虑将Lua嵌入到C ++应用程序中(在FreeBSD 8.2下运行)。但基准测试显示在某些情况下表现不佳。特别是当Lua尝试将字符串转换为数字并比较字符串时,它变得更慢,更糟糕的是,破坏了可扩展性(8个核心的性能比1个差!)。我现在认为它是语言环境,因为当我避免自动转换时,一切正常。但对于现实生活,我需要进行字符串比较和数字转换。我怎么能:

  1. 将Lua与语言环境隔离开来,即确保Lua的所有函数都没有间接使用语言环境。例如,我可以提供自己的转换和比较功能吗?

  2. 或完全禁用区域设置。我试过setlocale (LC_ALL, "C"),它运行正常(区域设置更改),但瓶颈仍然存在

  3. 更新

    根据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双转换比单线程更差。时间和gettimeofday规模严重。带有%s的sscanf也很差,这是非常令人惊讶的,但在我的情况下不是问题。

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

    顺便说一句,第一个基准测试是在Linux桌面上运行的,没有显示出任何奇怪的结果。我对它的FreeBSD行为感到惊讶。

1 个答案:

答案 0 :(得分:5)

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