2014-12-05 1 views
0

나는 지금 Project Euler에서 작업을 해결하기 위해 JS를 사용하고 있습니다. 작업 중 하나에 대해 6000 억 개의 연속 번호를 반복해야했습니다. 놀랍게도 NodeJS에서 약 14 시간이 걸렸습니다. , 내 컴퓨터에 약 200 밀리 초를 실행하는 자바로, 비교를 위해(var i = 0; i <600000000000; i ++) {}가 JavaScript에서 너무 오래 실행되는 이유

console.time('t') 
 
for (var i = 0; i < 600851475143; i++) {} 
 
console.timeEnd('t')

:

그냥 아래의 미리보기를 실행하고 브라우저가 시간 동안 갇혀 (내가 크롬과 파이어 폭스를 시도) 각 i의 제곱근을 계산하면 4 초입니다.

무슨 일입니까?

업데이트 : 모든 숫자를 반복하면이 particluar PE 문제를 해결하는 올바른 방법이 아니라는 것을 알고 있습니다. 문제는 그것에 관한 것이 아닙니다.

업데이트 2 : 나는 자바에 관해서 착각했다. 사람들이 올바르게 지적했듯이, 물리적으로는 빨리 실행할 수 없습니다. 나는 잘못된 번호를 사용하고있었습니다. 죄송합니다.

+0

그것이 생산하지 않기 때문에 JVM이 완전히 전체'for' 문을 제거 가능성이 높습니다 :

그리고도 재현 할 수는 다음과 같은 상황이 예상대로 실행 영원히 소요 부작용. 그리고 V8은 그렇게 똑똑하지 않습니다. (아직) – zerkms

+0

@zerkms는주의 깊게 읽었습니다. 모든 반복에서 전류 i의 제곱근을 계산하면 JVM이 4 초 실행됩니다. –

+0

예를 신중하게 작성하십시오. 예를 들어 비어있는 본문 루프입니다. – zerkms

답변

4

우선 첫 번째로 200ms와 4 초가 모두 우스꽝 스럽습니다. 하나의 루프 반복이 1 사이클 비용이 들더라도 적어도 150 (초당 4GHz) 초. 그러나 빈 루프조차도 반복 당 최소 3 사이클의 비용이 소요됩니다 (최적화되지 않았다고 가정 할 때). 제곱근을 계산하면 반복 당 5-10이 더해져 4 초 만에 6000 억 루비의 뿌리를 만들지 않아도됩니다.

class Test { 
    public static void main(String[] args) { 
     for (long i = 0; i < 600851475143L; ++i) { 
     } 
    } 
} 

을 다음

$ java -version 
java version "1.7.0_55" 
OpenJDK Runtime Environment (IcedTea 2.4.7) (7u55-2.4.7-1ubuntu1) 
OpenJDK 64-Bit Server VM (build 24.51-b03, mixed mode) 
$ javac test.java 
$ java -cp . Test 
+0

참으로 호기심이 많기 때문에 OP에서 바이트 코드를 인스턴트와 4 초 버전으로 제공하도록 실제로 요청할 것입니다. – zerkms

+0

자바에 대한 오해 (질문 업데이트 참조). 따라서 루프 당 6 조 회, 각 반복마다 10 프로세서 사이클을 실행하는 경우 4GHz 프로세서에서 4 시간을 약간 넘는 15000 초가 걸리는 것으로 나타났습니다. 느린 프로세서에서 코드를 실행했다는 것을 고려하면 모든 것이 명확 해졌습니다. 고맙습니다. –