VB.NET 2010을 사용하여 계산 집약적 인 프로그램을 작성 중이며 속도를 최적화하고 싶습니다. 운영자 AndAlso
및 OrElse
은 작업 결과가 클래스 수준 변수에 할당 된 경우 비정상적으로 느린 것으로 나타났습니다. 예를 들어, 문또한 OrElse는 비정상적으로 느릴 수 있습니다.
a = _b AndAlso _c
_a = a
는 컴파일 된 EXE에
_a = _b AndAlso _c
은 약 80 기계 사이클이 소요되는 하나의 문을 사이 약 6 기계 사이클을 가지고있다. 여기서 _a
, _b
및 _c
은 Form1
의 Private Boolean 변수이며 해당 문은 Form1
의 인스턴스 프로 시저에 있으며이 중 a
은 로컬 부울 변수입니다.
단일 명령문이 오래 걸리는 이유를 찾을 수 없습니다.
이Instruction Explanation Stack
00: ldarg.0 Push Me (ref to current inst of Form1) Me
01: ldarg.0 Push Me Me, Me
02: ldfld bool Form1::_b Pop Me, read _b and push it _b, Me
07: brfalse.s 11 Pop _b; if false, branch to 11 Me
09: ldarg.0 (_b true) Push Me Me, Me
0a: ldfld bool Form1::_c (_b true) Pop Me, read _c and push it _c, Me
0f: brtrue.s 14 (_b true) Pop _c; if true, branch to 14 Me
11: ldc.i4.0 (_b, _c not both true) Push result 0 result, Me
12: br.s 15 Jump unconditionally to 15 result, Me
-----
14: ldc.i4.1 (_b, _c both true) Push result 1 result, Me
15: stfld bool Form1::_a Pop result and Me; write result to _a (empty)
1a:
사람이 문 _a = _b AndAlso _c
80 기계 사이클 대신 예측 5 정도 소요 이유에 어떤 빛이 있나 : 나는 좋은 보이는 CIL 코드의 수준에 NetReflector을 사용하여 살펴 보았다?
.NET 4.0 및 Visual Studio Express 2010과 함께 Windows XP를 사용하고 있습니다. 근본적으로 Stopwatch 개체를 사용하는 솔직히 더러운 스 니펫으로 시간을 측정하여 For-Next 루프 시간을 측정합니다. 코드를 질문하고 빈 For-Next 루프와 비교하십시오. 몇 사이클을 낭비하고 프로세서 스톨을 방지하기 위해 두 루프에 하나의 쓸모없는 명령어가 포함되어 있습니다. 내 목적을 위해 충분하지만 좋은.
죄송합니다.이 의견이 다소 복잡해 보이지만 계산 속도와주기를 주기적으로 찾고 있다면 일반적으로 VB.NET 또는 .NET을 사용하지 않을 것입니다. – TyCobb
코드를 더 게시하면 효율성 향상을위한 다른 제안을 제공 할 수 있습니다. – Jeremy
그냥 AND를 사용해 보셨습니까? 특히 Booleans 변수로 작업하고 있기 때문에 특히 그렇습니다. –