我的Lua代码100%利用我的CPU

时间:2016-07-29 07:25:44

标签: lua

我想用真实字符替换html源中的utf8 html实体。我有"实体"用下面的代码遍历的替换表。如果我运行此代码,它使用我的CPU高达100%。

请问您能帮我更好地重写第一个循环吗?我知道在Lua中字符串是不可变的,所以我认为有很多数据变量的副本,这可能是原因。

select t1.id1, t2.id2, t3.id3
from table1 t1
left join table2 t2
on t1.id1 = t2.id2
left join table3 t3
on t2.id2 = t3.id3
UNION 
select t1.id1, t2.id2, t3.id3
from table2 t2
left join table3 t3
on t2.id2 = t3.id3
left join table1 t1
on t2.id2 = t1.id1
UNION 
select t1.id1, t2.id2, t3.id3
from table3 t3
left join table2 t2
on t3.id3 = t2.id2
left join table1 t1
on t3.id3 = t1.id1;
+------+------+------+
| id1  | id2  | id3  |
+------+------+------+
|    3 |    3 | NULL |
|    1 | NULL | NULL |
|    2 | NULL | NULL |
| NULL |    5 |    5 |
| NULL |    4 | NULL |
| NULL | NULL |    6 |
| NULL | NULL |    7 |
------+------+------+
7 rows in set (0.00 sec)

3 个答案:

答案 0 :(得分:0)

编辑:误读了问题,所以用同样的原则重写了它。

根据this answer,您可以使用str:gsub(pattern, function)patternstr的所有匹配项执行自定义替换。

模式&#.+;应匹配所有utf字符,为每个匹配调用function

在回调function中剩下要做的就是找到匹配的人类可读的char,并将其作为替换值返回。为此,如果entities字符串为utf键,并且各自的char为值,则会更快,因此您不必每次都迭代entities时间。

另一个编辑:根据lua documentation on gsub,第二个参数可以是一个表。在这种情况下,查找是自动完成的,它将尝试使用每个匹配作为键,将其替换为该表中的值。一旦重组entities

,这将是最干净的解决方案

答案 1 :(得分:0)

-- Lua 5.3 required
local html_entities = {
   nbsp = " ",
   lt = "<",
   gt = ">",
   amp = "&",
   euro = "€",
   copy = "©",
   Gamma = "Γ",
   Delta = "Δ",
   prod = "∏",
   sum = "∑",
   forall = "∀",
   exist = "∃",
   empty = "∅",
   nabla = "∇",
   isin = "∈",
   notin = "∉",
   -- + many more rows
}


local str = [[&exist; &euro; &empty; &Delta; &#8364; &#x20AC;]]

str = str:gsub("&(#?)(.-);",
   function(prefix, name)
      if prefix ~= "" then
         return utf8.char(tonumber("0"..name))
      else
         return html_entities[name]
      end
   end
)

print(str)

答案 2 :(得分:0)

还有另一种替换字符序列的方法。

local function clear_text(data)
    return (string.gsub(
        data,
        [=[[!"#$%&']]=],  -- all your entries goes here, between [=[  and  ]=]
        function(c)
            return "&#" .. string.byte(c) .. ";"  -- replace with char code
        end
    ))
end

-- this is just for testing ... replacement in many html sources
for i=1,200 do
    local data = "!#!#!#!#!#!";
    print(clear_text(data))
end