හොඳයි, ඔබ කාලය ගත කරන ආකාරය මට හරිම නපුරුයි. මුළු ලූපයටම කාලය යෙදවීම වඩා සංවේදී වනු ඇත:
var stopwatch = Stopwatch.StartNew();
for (int i = 1; i < 100000000; i++)
{
Fibo(100);
}
stopwatch.Stop();
Console.WriteLine("Elapsed time: {0}", stopwatch.Elapsed);
ඒ ආකාරයෙන් ඔබ ඉතා කුඩා වේලාවන්, පාවෙන ලක්ෂ්ය ගණිතය සහ සමුච්චිත දෝෂ වල අනුකම්පාව නොදක්වයි.
එම වෙනස සිදු කිරීමෙන් පසුව, "අල්ලා නොගන්නා" අනුවාදය "ඇල්ලීමේ" අනුවාදයට වඩා මන්දගාමී දැයි බලන්න.
සංස්කරණය කරන්න: හරි, මම එය මා විසින්ම උත්සාහ කර ඇත්තෙමි. හරිම අමුතුයි. උත්සාහය / ඇල්ලීම නරක ඉන්ලයින් අක්රීය කරන්නේ දැයි මම කල්පනා කළෙමි, නමුත් [MethodImpl(MethodImplOptions.NoInlining)]
ඒ වෙනුවට භාවිතා කිරීම උදව් කළේ නැත ...
මූලික වශයෙන් ඔබ cordbg යටතේ ඇති ප්රශස්ත JITted කේතය දෙස බැලිය යුතුය, මම සැක කරමි ...
සංස්කරණය කරන්න: තවත් තොරතුරු කිහිපයක්:
- උත්සාහය / ඇල්ලීම
n++;
රේඛාව වටා තැබීම තවමත් කාර්ය සාධනය වැඩි දියුණු කරයි, නමුත් එය මුළු කොටස වටා තැබීම තරම් නොවේ
- ඔබ විශේෂිත ව්යතිරේකයක් අල්ලා ගන්නේ නම් (
ArgumentException
මගේ පරීක්ෂණ වලදී) එය තවමත් වේගවත්ය
- ඔබ ව්යතිරේකය ඇල්ලීමේ කොටසෙහි මුද්රණය කළහොත් එය තවමත් වේගවත් ය
- ඔබ ඇල්ලීමේ කොටසෙහි ව්යතිරේකය නැවත සලකා බැලුවහොත් එය නැවතත් මන්දගාමී වේ
- ඔබ අල්ලා ගැනීමේ වාරණයක් වෙනුවට අවසාන වාරණයක් භාවිතා කරන්නේ නම් එය නැවතත් මන්දගාමී වේ
- ඔබ අවසාන වාරණයක් මෙන්ම ඇල්ලීමේ වාරණයක් භාවිතා කරන්නේ නම් එය වේගවත්ය
අමුතු ...
සංස්කරණය කරන්න: හරි, අපි විසුරුවා හැරියා ...
මෙය C # 2 සම්පාදකය සහ .NET 2 (32-බිට්) CLR භාවිතා කරමින් mdbg සමඟ විසුරුවා හරිනු ලැබේ (මගේ යන්ත්රයේ කෝඩ්බීජී නොමැති බැවින්). නිදොස්කරණය යටතේ වුවද, මම තවමත් එකම කාර්ය සාධන බලපෑම් දකිමි. වේගවත් අනුවාදය හසුරුවන්නෙකු try
සමඟ විචල්ය ප්රකාශන සහ ආපසු ප්රකාශය අතර සෑම දෙයක්ම අවහිර කරයි catch{}
. නිසැකවම මන්දගාමී අනුවාදය උත්සාහය / අල්ලා ගැනීම හැරෙන්නට සමාන වේ. ඇමතුම් කේතය (එනම් ප්රධාන) අවස්ථා දෙකෙහිම එක හා සමාන වන අතර එකලස් කිරීමේ නියෝජනයක් ඇත (එබැවින් එය ආශ්රිත ගැටළුවක් නොවේ).
වේගවත් අනුවාදය සඳහා විසුරුවා හරින ලද කේතය:
[0000] push ebp
[0001] mov ebp,esp
[0003] push edi
[0004] push esi
[0005] push ebx
[0006] sub esp,1Ch
[0009] xor eax,eax
[000b] mov dword ptr [ebp-20h],eax
[000e] mov dword ptr [ebp-1Ch],eax
[0011] mov dword ptr [ebp-18h],eax
[0014] mov dword ptr [ebp-14h],eax
[0017] xor eax,eax
[0019] mov dword ptr [ebp-18h],eax
*[001c] mov esi,1
[0021] xor edi,edi
[0023] mov dword ptr [ebp-28h],1
[002a] mov dword ptr [ebp-24h],0
[0031] inc ecx
[0032] mov ebx,2
[0037] cmp ecx,2
[003a] jle 00000024
[003c] mov eax,esi
[003e] mov edx,edi
[0040] mov esi,dword ptr [ebp-28h]
[0043] mov edi,dword ptr [ebp-24h]
[0046] add eax,dword ptr [ebp-28h]
[0049] adc edx,dword ptr [ebp-24h]
[004c] mov dword ptr [ebp-28h],eax
[004f] mov dword ptr [ebp-24h],edx
[0052] inc ebx
[0053] cmp ebx,ecx
[0055] jl FFFFFFE7
[0057] jmp 00000007
[0059] call 64571ACB
[005e] mov eax,dword ptr [ebp-28h]
[0061] mov edx,dword ptr [ebp-24h]
[0064] lea esp,[ebp-0Ch]
[0067] pop ebx
[0068] pop esi
[0069] pop edi
[006a] pop ebp
[006b] ret
මන්දගාමී අනුවාදය සඳහා විසුරුවා හරින ලද කේතය:
[0000] push ebp
[0001] mov ebp,esp
[0003] push esi
[0004] sub esp,18h
*[0007] mov dword ptr [ebp-14h],1
[000e] mov dword ptr [ebp-10h],0
[0015] mov dword ptr [ebp-1Ch],1
[001c] mov dword ptr [ebp-18h],0
[0023] inc ecx
[0024] mov esi,2
[0029] cmp ecx,2
[002c] jle 00000031
[002e] mov eax,dword ptr [ebp-14h]
[0031] mov edx,dword ptr [ebp-10h]
[0034] mov dword ptr [ebp-0Ch],eax
[0037] mov dword ptr [ebp-8],edx
[003a] mov eax,dword ptr [ebp-1Ch]
[003d] mov edx,dword ptr [ebp-18h]
[0040] mov dword ptr [ebp-14h],eax
[0043] mov dword ptr [ebp-10h],edx
[0046] mov eax,dword ptr [ebp-0Ch]
[0049] mov edx,dword ptr [ebp-8]
[004c] add eax,dword ptr [ebp-1Ch]
[004f] adc edx,dword ptr [ebp-18h]
[0052] mov dword ptr [ebp-1Ch],eax
[0055] mov dword ptr [ebp-18h],edx
[0058] inc esi
[0059] cmp esi,ecx
[005b] jl FFFFFFD3
[005d] mov eax,dword ptr [ebp-1Ch]
[0060] mov edx,dword ptr [ebp-18h]
[0063] lea esp,[ebp-4]
[0066] pop esi
[0067] pop ebp
[0068] ret
සෑම අවස්ථාවකම *
නිදොස් කිරීම සරල "පියවරක්" තුළට ඇතුළු වූ ස්ථානය පෙන්වයි.
සංස්කරණය කරන්න: හරි, මම දැන් කේතය හරහා බැලුවෙමි, එක් එක් අනුවාදය ක්රියා කරන ආකාරය මට දැකගත හැකි යැයි මම සිතමි ... මන්දගාමී අනුවාදය මන්දගාමී බව මම විශ්වාස කරන්නේ එය අඩු ලේඛනයක් සහ වැඩි ඉඩ ප්රමාණයක් භාවිතා කරන බැවිනි. එහි කුඩා අගයන් සඳහා n
වේගවත් විය හැකිය - නමුත් ලූපය වැඩි කාලයක් ගත කරන විට එය මන්දගාමී වේ.
සමහරවිට උත්සාහක / උඩ වාරණ හමුදා වැඩි ලේඛන ගැලවීම හා යථා තත්ත්වයට පත් කිරීමට, සඳහා JIT මෙන්ම කම්බියක් සඳහා එම භාවිතා ඉතින් ... සමස්ත කාර්ය සාධනය වැඩි දියුණු කිරීම සඳහා සිදු කරන. “සාමාන්ය” කේතයේ ඇති තරම් ලේඛණ භාවිතා නොකිරීම JIT ආයතනයට සාධාරණ තීරණයක්ද යන්න පැහැදිලි නැත .
සංස්කරණය කරන්න: මෙය මගේ x64 යන්ත්රයෙන් උත්සාහ කර බලන්න. මෙම කේතයේ x86 CLR ට වඩා x64 CLR වඩා වේගවත් (3-4 ගුණයක් පමණ වේගවත්) වන අතර x64 යටතේ උත්සාහ කරන්න / අල්ලා ගැනීමේ කොටස සැලකිය යුතු වෙනසක් නොකරයි.