2016-06-14 1 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 개의 키를 찾고 있기 때문에 첫눈에 맞춰야합니다. 일치 항목이 첫 번째 키 중 하나 인 경우 확실히 빠르며 수신 프로세스가 병목 현상 일 수 있습니다. 그러나 일치하는 항목이 없으면 40 개의 find()가 있습니다. 두 개의 ticks가 필요합니다. – 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 
관련 문제