【问题标题】:isolate lua from locale将 lua 与语言环境隔离
【发布时间】:2011-04-25 13:51:36
【问题描述】:

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

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

  2. 或完全禁用语言环境。我试过setlocale (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 双转换的性能比单线程差。 time 和 gettimeofday 的比例很差。带有 %s 的 sscanf 的扩展性也很差,这很令人惊讶,但在我的情况下不是问题。

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

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

【问题讨论】:

  • 那么,它根本就不是语言环境?如果你在 Lua 核心中有什么改变呢?
  • 我将 #define lua_number2str(s,n) sprintf((s), LUA_NUMBER_FMT, (n)) 更改为 my_format_double (s,n)。不确定它是否是语言环境,但它位于 sprintf %lf 中。

标签: lua locale


【解决方案1】:

为避免字符串比较中的语言环境,请将lvm.c 中的strcoll 更改为strcmp。要避免字符串到数字转换中的语言环境,请更改luaconf.hlua_str2number 的定义以避免strtod。 (但请注意,提供您自己的strtod 并不是一件容易的事。)您还可以删除llex.c 中的trydecpoint

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-09
    • 1970-01-01
    • 2019-06-25
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    相关资源
    最近更新 更多