2011-09-24 3 views
2

javascript에 다음과 같은 함수를 작성하는 두 가지 기능적으로 동일한 방법이 있습니다. 더 효율적이거나 더 효율적인 이유는 무엇입니까?for 루프를 실행할 때 coffeescript가 더 좋고/더 효율적입니까?

(str) -> 
    s = 0 
    for i in [0...str.length] 
    s += str.charCodeAt i 
    s 

또는

(str) -> 
    s = 0 
    for i in str 
    s += i.charCodeAt 0 
    s 

은 제외 : 당신은이 일을 다른 방법을 제안 해 주실 수 있나요?

편집 : JSPerf에 따르면 첫 번째 속도가 빠릅니다. http://jsperf.com/coffee-for-loop-speed-test -이 이유가 무엇인가요?

+0

그것은 약 1 마이크로 빨리 (내 컴퓨터)에있다, 나는 당신에게 그주지 (1.64ms 대 0.533ms)의 문자 코드를 얻는 경우 –

답변

5

첫 번째는 더 우아하고 효율적입니다. 두 번째 문자열은 문자열의 각 문자를 불필요하게 별도의 문자열로 복사 한 다음 charCode으로 변환합니다.

+0

내가 처음에 궁금했다 문자열의 위치는 문자열의 길이에 따라 시간이 갈수록 늘어 났지만 생각할 때마다 각 문자에 대한 개별 문자열을 만드는 데 걸리는 시간과 비교할 때 차이가 거의 없습니다. 감사! :) – Ada

1

functional programming에 익숙하십니까? 함께 쓰는 Coffeescript + Underscore.js은 정말 대단합니다. ECMAScript 5에 정의 된 기본 Array#reduce 또는 밑줄 함수를 사용할 수 있습니다. 첫 번째의 예 :

(s.charCodeAt(0) for s in "hello").reduce((acc, x) -> acc + x) # 532 
관련 문제