2016-06-08 2 views
0

참조 티클 8.4 아래 코드와 아래의 쉘 출력 변수에서 변수 값을 가져올 때, 세트보다 느린 것 같다TCL의 SUBST 변수의 이름

% set k a 
% set m k 
% puts [set $m ] 
a 
% puts [subst $$m] 
a 

을 그래서, 그것을 set $msubst $$m은 동일한 기능을 가지고있는 것처럼 보입니다. SUBST보다 빠르게 ~ 2.5

이 이 설정은

으로 볼 수있는 입니다

% time { set $m } 1000000 
0.256435 microseconds per iteration 
% time { subst $$m } 1000000 
0.627714 microseconds per iteration 
이 개 질문은 다음과 같습니다 : 그러나 (간단한 테스트 케이스에서) 런타임이 다소 다르다 (아래 쉘 결과의 지속을 참조하십시오. 질문 할 : 를 1. 왜?
2. 나는 빨리 티클 8.5 ~ 3.6 인 것을 보았다. 우리는이 이후 릴리스에서, 경우 남아있는 것으로 예상 할 수 있습니까?
감사

+0

이 점을주의 깊게 살펴 보겠습니다. 1 마이크로 초 미만입니다. –

+0

참. 하지만 수억 번 반복해야한다면 어떻게 될까요? – user1134991

+0

반복 당 0.5 마이크로 초, 5 억 회 반복은 약 4 분입니다. 살펴볼 가치가 있지만 가장 큰 병목은 아닙니다. –

답변

3

당신은 일을 정확하게 유지 할 것으로 예상 할 수 있습니다 동일 사용시 :

puts [set $m] 

Tcl은 연산 스택에 이름이있는 변수를 읽은 다음 결과가 puts 인 변수를 읽은 후 (내부 작업 스택에 결과 저장) m 변수를 한 번 컴파일합니다.

당신이 할 경우 :

puts [subst $$m] 

은 Tcl 컴파일이 $의 연결 및 m, (다시 구문 분석하고 바이트 코드 그 조각을 컴파일) 대체 엔진에 전화를 읽기의 결과 만 결과는 puts입니다. 어느 것이 훨씬 더 복잡합니다. 당신이 한 경우

당신은 차이를 볼 것입니다 :

set m {k[exit]} 

당신이 존재하지 않는 (이상하게 명) 변수에서 읽을하려고했던 것을 당신에게 말할 것이다 첫번째. 두 번째 프로세스를 종료합니다.

+0

실제로, Tcl 8.6에서 8.5보다 속도 차이가 더 클 것입니다. 상수가 아닌 문자열의 subst가 성능에 영향을 미치기 때문입니다. 반면에 _constant_ strings의 subst는 성능을 향상시킵니다. (이는 비 재귀 적 평가 엔진에서 사용 가능하게 된 방식에서 비롯됩니다.) –

+1

-nocommands 및 -nobackslashes를 지정하면 성능이 향상됩니까? –

+0

@ 글렌 잭맨 아마별로; '['와'\'에 대한 응답으로 일어나는 일을 정확히 바꾼다. 그러나 파서를 바꿔야한다. 두 경우 모두 필요한 변수 조회 외에도 subst 명령 (8.6의 바이트 코드 생성 포함)을 사용하여 추가 구문 분석을 수행하고 있습니다. 동적 변수 이름을 사용하는 경우 일반적으로 고정 로컬 별칭에 'upvar 0'하는 것이 가장 좋습니다 ... –