2016-06-14 12 views
1

組み込みMCU上で動作するluaにvt100(oldschool端末)を実装しています。パフォーマンスはここで問題になります。文字列の文字列を正確に検索し、最初の一致を返します

Givenは、いくつかの(予測できない数)文字を含む文字列(入力行)です。 この文字列では、一連の文字のうち最初の一致を探したいと思います。例えば

:私の例では

-- ASCII value(hex) of keyboard keys. 
#define KEY_UP  "\x41" 
#define KEY_DOWN "\x42" 
#define KEY_RIGHT "\x43" 
#define KEY_LEFT "\x44" 

-- terminal object is defined and created 

function terminal:receive() 
    -- Set buffer and shorthand to self.port.read 
    local read = function() return self.port:read() end 
    local received = "" 

    while true do 
     -- Read Input 
     local line = read() 
     if (not line) then break end 
     received = received .. line 

     -- Search for the key. 
     -- Don't search in line, due different baudrates might not 
     -- Get the entire digit at once. 
     if (received:find(KEY_UP)) then 
      return KEY_UP 
     elseif (received:find(KEY_DOWN)) then 
      return KEY_DOWN 
     ... and so on 
     end 
    end 
end 

ソリューションは確実に、一種の遅いです。よりパフォーマンスの高いソリューションを考え出すのはそれほど難しいことではありません。しかし、これに対して最も効果的な解決策は何ですか?

+0

プロファイラーは使用しましたか?パターンマッチングの部分がパフォーマンスのボトルネックになっていますか? –

+0

おそらくそうではありませんが、それは別の質問です。 – Sempie

+0

私は最初の一見でマッチングを心配しています、私は40個のキーのようなものを探しているからです。一致が最初のキーの1つであれば、それは確かに静かであり、受信プロセスがボトルネックになる可能性があります。しかし、一致がなければ、2つ以上のダニを取るfind()が40回あります。 – Sempie

答えて

0

あなたが探しているすべての文字を含む単一のパターンを作ることができます。結果をキャプチャして返すことができます。

これは、あなたが探している文字の中に優先順位がない場合に機能します。

1

すべての一致が1文字長いので、[]を使用して一致させて()をキャプチャして、一致したものを確認することができます。

#define KEY_UP  "\x41" 
#define KEY_DOWN "\x42" 
#define KEY_RIGHT "\x43" 
#define KEY_LEFT "\x44" 
-- assemble pattern once for performance 
local KEY_pattern = "([" .. KEY_UP .. KEY_DOWN .. KEY_RIGHT .. KEY_LEFT .. "])" 

-- ............... skipped ............... 
local match_start, match_end, match_content = received:find(KEY_pattern) 
if (match_content) then 
    return match_content 
end 
関連する問題