2012-05-12 1 views
1

요즘 나는 작은 예제/프로젝트를 진행하고 있습니다. 내가 뭘하고 가변 길이 임의의 문자열의 n 집합을 만드는 것입니다. 여기에 내가 원하는 걸 얻으려고합니다 :임의로 생성 된 문자열을 중첩 테이블로 삽입

  • 길이는 3에서 25 자까지 두 가지 이름이 있습니다.
  • 메시지의 범위는 40-300 자입니다.

내 C 예제에서는 struct을 만들고이 테이블에 목록으로 계속 삽입했습니다.

tTableName = { 
    [1] = { 
    "To" = "Name 1", 
    "From" = "Name 2", 
    "Message" = "The first message generated" 
    } 
    [2] = { 
    "To" = "Name 3", 
    "From" = "Name 4", 
    "Message" = "The second message generated" 
    } 
} 

그래서, 기본적으로 내 구조는 다음과 같이 간다 : 내가 사용할 수 있도록

struct PM { 
    char *sTo, *sFrom, *sMessage; 
} PMs; 

내가 LUA에 유사한 구조/테이블을 원하는 내 LUA 예에서,이 같은 중첩 테이블이 원하는 table.insert 방법. 나는 현재 이렇게하고있다 :

tTempTable = { 
    "To" = "Name 1", 
    "From" = "Name 2", 
    "Message" = "The first message generated" 
} 
table.insert(tTableName, tTempTable) 

그러나 나는 많은 처리 시간을 낭비한다고 생각하고있다. 현재 나는 PM의 샘플만을 생성 중입니다. 하지만 나중에 * * s을 생성 할 것입니다. 제발 조언.

+2

난 당신이 요구하는지 확신 해요 ... 당신이 충고가 무엇을 원하는가 ? 또한 이러한 테이블 생성자는 유효한 lua가 아닙니다. – daurnimator

답변

2

병목 현상이 어디인지 알지도 못하기 전에 코드를 미리 성숙하게 최적화하는 함정에 빠져 있다고 생각합니다.하지만 다음 문서에는 테이블을 비롯하여 일반적으로 루아에 대한 많은 최적화 정보가 들어 있습니다. 그것을 쓴 사람은 루아의 수석 건축가 중 하나입니다.

http://www.lua.org/gems/sample.pdf

+0

그 책을 읽어 주셔서 감사합니다. :) – hjpotter92

1

우선, 이것은 정말 문제가 아닙니다. 이 일을하는 더 효율적인 방법이 있는지 묻고있는 것 같아요? 일반적으로 명확성을 위해 글을 쓰고 싶습니다. don't sweat small performance gains at all unless you run into issues.하지만 효율성에 대한 몇 가지 참고 사항을 포함하여 코드에 대한 몇 가지 참고 사항이 있습니다.

게시 된 테이블 생성자가 유효하지 않습니다. 다음 픽스 중 하나가 작동합니다.

tTempTable = { 
    ["To"] = "Name 1", 
    ["From"] = "Name 2", 
    ["Message"] = "The first message generated" 
} 
tTempTable = { 
    To = "Name 1", 
    From = "Name 2", 
    Message = "The first message generated" 
} 

배열을 만들 때 숫자 인덱스를 지정할 필요가 없습니다. 이 작업을 대체 할 수 똑같은 일을 의미하지만, 더 간결하다이와

tTableName = { 
    [1] = { To = "Name 1", From = "Name 2", Message = "The first message generated" }, 
    [2] = { To = "Name 3", From = "Name 4", Message = "The second message generated" }, 
} 

,이 또한보다 효율적으로 될 일이

tTableName = { 
    { To = "Name 1", From = "Name 2", Message = "The first message generated" }, 
    { To = "Name 3", From = "Name 4", Message = "The second message generated" }, 
} 

; 루아는 필요한 배열 크기를 미리 할당 할 수 있습니다. 반면에 이전 생성자를 사용하면 충분하지 않습니다.

일반적으로 이것을 작성하는 더 좋은 방법은 응용 프로그램에 대해 더 많이 알지 못해서 말하기 어렵습니다. 일부 PM 코드를 테스트하려는 경우 사용 시점에서 필요로하는 문자열을 생성하지 않는 것이 어떻습니까? 왜 그것들을 테이블에 미리 할당해야합니까?

미리 할당해야하는 경우 구조화 된 데이터로 저장할 필요가 없습니다.당신은 세 가지 배열을 할 수 : ToNames는, FromNames이 메시지는 다음 사용 지점에서 무작위로 그들로부터 선택

local to  = ToNames [ math.random(1,#ToNames ) ] 
local from = FromNames[ math.random(1,#FromNames) ] 
local message = Messages [ math.random(1,#Messages) ] 
TestPM(to, from, message) 
+0

그 조언 주셔서 감사. 그럼에도 무작위로 메시지를 생성하고 있습니다 (문법적으로는 이해하지 못할 수도 있지만 그럼에도 불구하고 문장을 생성 할 수도 있습니다.) 이제 PM을 미리 형식화 된 문자열로 결합하여 문자열을 to/from/message 헤더로 추출합니다. 'string.find'. 링크를 주셔서 감사 드리며, 대신에 덧붙이기를 권합니다. – hjpotter92

+0

table.insert에 대한 메모는 실제로 부정확합니다 .table.insert에 대한 색인을 지정하지 않으면 삽입을위한 기본 지점은 n + 1, 여기서 n은 테이블의 길이 (끝)입니다 ... lua 참조 매뉴얼에서 확인할 수 있습니다 –

+0

@Mike Cocoran : 맞습니다. – Mud