මුල් ප්රශ්නය
එක් ලූපයක් ලූප දෙකකට වඩා මන්දගාමී වන්නේ ඇයි?
නිගමනය:
නඩුව 1 යනු අකාර්යක්ෂම එකක් වන සම්භාව්ය අන්තර් මැදිහත්වීමේ ගැටලුවකි. බොහෝ යන්ත්ර සැකසුම් හා සංවර්ධකයින් බහු-නූල් යෙදුම් මෙන්ම සමාන්තර වැඩසටහන්කරණය කිරීමේ හැකියාව ඇති බහු-මූලික පද්ධති තැනීම හා සැලසුම් කිරීම අවසන් කිරීමට මෙය ප්රධාන හේතුවක් යැයි මම සිතමි.
RAM, හැඹිලි, පිටු ලිපිගොනු ආදිය සමඟ වැඩ කිරීම සම්බන්ධව ගොඩවල් වෙන් කිරීම සඳහා දෘඩාංග, මෙහෙයුම් පද්ධතිය සහ සම්පාදක (ය) එකට ක්රියා කරන ආකාරය සම්බන්ධ නොකර මේ ආකාරයේ ප්රවේශයකින් එය බැලීම; මෙම ඇල්ගොරිතමවල පදනමේ ඇති ගණිතය අපට පෙන්වන්නේ මෙම දෙකෙන් වඩා හොඳ විසඳුම කුමක්ද යන්නයි.
අපි ගැන සාදෘශ්යයක් භාවිතා කළ හැකි Boss
වීම එය Summation
නියෝජනය කරන බව For Loop
සේවකයන් අතර ගමන් කිරීමට ඇති බව A
සහ B
.
කේස් 2 අවම වශයෙන් අඩක් තරම් වේගවත් බව අපට පහසුවෙන් දැක ගත හැකිය. 1 වන නඩුවට වඩා මඳක් වැඩි නොවේ නම් ගමන් කිරීමට අවශ්ය දුර ප්රමාණය හා කම්කරුවන් අතර ගතවන කාලය. මෙම ගණිතය බෙන්ච්මාර්ක් ටයිම්ස් මෙන්ම එකලස් කිරීමේ උපදෙස්වල වෙනස්කම් ගණන සමඟ මුලුමනින්ම පාහේ හා පරිපූර්ණ ලෙස පෙළ ගැසී ඇත.
මේ සියල්ල පහතින් ක්රියාත්මක වන්නේ කෙසේදැයි මම දැන් පැහැදිලි කිරීමට පටන් ගනිමි.
ගැටලුව තක්සේරු කිරීම
OP හි කේතය:
const int n=100000;
for(int j=0;j<n;j++){
a1[j] += b1[j];
c1[j] += d1[j];
}
සහ
for(int j=0;j<n;j++){
a1[j] += b1[j];
}
for(int j=0;j<n;j++){
c1[j] += d1[j];
}
සලකා බැලීම
ලූප සඳහා වන ප්රභේද 2 පිළිබඳ OP හි මුල් ප්රශ්නය සහ හැඹිලි වල හැසිරීම පිළිබඳ ඔහුගේ සංශෝධිත ප්රශ්නය සහ තවත් බොහෝ විශිෂ්ට පිළිතුරු සහ ප්රයෝජනවත් අදහස් සලකා බැලීම; මෙම තත්වය සහ ගැටලුව පිළිබඳව වෙනස් ප්රවේශයක් ගැනීමෙන් මම මෙහි වෙනස් දෙයක් කිරීමට උත්සාහ කරමි.
ප්රවේශය
ලූප දෙක සහ හැඹිලි සහ පිටු ගොනු කිරීම පිළිබඳ සියලු සාකච්ඡා සලකා බැලීමේදී මෙය වෙනස් දෘෂ්ටිකෝණයකින් බැලීමට වෙනත් ප්රවේශයක් ගැනීමට මම කැමතියි. හැඹිලිය සහ පිටු ලිපිගොනු හෝ මතකය වෙන් කිරීම සඳහා ක්රියාත්මක කිරීම සම්බන්ධ නොවන එකක්, ඇත්ත වශයෙන්ම, මෙම ප්රවේශය සත්ය දෘඩාංග හෝ මෘදුකාංග ගැන කිසිසේත් තැකීමක් නොකරයි.
ඉදිරිදර්ශනය
ටික වේලාවක් කේතය දෙස බැලීමෙන් පසු ගැටලුව කුමක්ද සහ එය ජනනය කරන්නේ කුමක් ද යන්න පැහැදිලි විය. අපි මෙය ඇල්ගොරිතම ගැටළුවක් බවට පත් කර ගණිතමය අංකන භාවිතා කිරීමේ දෘෂ්ටි කෝණයෙන් බලමු. ඉන්පසු ගණිත ගැටලු මෙන්ම ඇල්ගොරිතම සඳහා ප්රතිසමයක් යොදමු.
අප දන්නා දේ
අපි දන්නවා මේ ලූපය 100,000 වතාවක් ධාවනය වන බව. ඒ වගේම අපි දන්නවා a1
, b1
, c1
සහ d1
64-bit ගෘහ නිර්මාණ ශිල්පය පිළිබඳ සූචක ඇත. 32-බිට් යන්ත්රයක C ++ තුළ, සියලු දර්ශකයන් බයිට් 4 ක් වන අතර 64-බිට් 64 යන්ත්රයක, දර්ශකයන් ස්ථාවර දිගකින් යුක්ත බැවින් ඒවා ප්රමාණයෙන් බයිට් 8 කි.
මෙම අවස්ථා දෙකෙහිම වෙන් කළ යුතු බයිට් 32 ක් අප සතුව ඇති බව අපි දනිමු. එකම වෙනස වන්නේ අපි එක් එක් පුනරාවර්තනය සඳහා බයිට් 32 ක් හෝ බයිට් 2-8 කට්ටල 2 ක් වෙන් කිරීමයි. දෙවන අවස්ථාවෙහිදී අපි ස්වාධීන ලූප දෙකම සඳහා එක් එක් නැවතීමේ ක්රියාවලිය සඳහා බයිට් 16 ක් වෙන් කරමු.
ලූප දෙකම තවමත් මුළු ප්රතිපාදන වලින් බයිට් 32 ට සමාන වේ. මෙම තොරතුරු සමඟ අපි දැන් ඉදිරියට ගොස් මෙම සංකල්පවල සාමාන්ය ගණිතය, ඇල්ගොරිතම සහ ප්රතිසම පෙන්වමු.
අවස්ථා දෙකේදීම එකම කට්ටලයක් හෝ මෙහෙයුම් සමූහයක් සිදු කළ යුතු වාර ගණන අපි දනිමු. අවස්ථා දෙකේදීම වෙන් කළ යුතු මතක ප්රමාණය අපි දනිමු. මෙම අවස්ථා දෙකම අතර ප්රතිපාදනවල සමස්ත කාර්ය භාරය දළ වශයෙන් සමාන වනු ඇතැයි අපට තක්සේරු කළ හැකිය.
අප නොදන්නා දේ
අපි කවුන්ටරයක් සකසා මිණුම් ලකුණක් පරීක්ෂා කළහොත් මිස එක් එක් සිද්ධිය සඳහා කොපමණ කාලයක් ගතවේදැයි අපි නොදනිමු. කෙසේ වෙතත්, මිණුම් සලකුණු දැනටමත් මුල් ප්රශ්නයෙන් සහ සමහර පිළිතුරු සහ අදහස් වලින් ඇතුළත් කර ඇත; මේ දෙක අතර සැලකිය යුතු වෙනසක් අපට දැකිය හැකි අතර මෙම ගැටලුවට මෙම යෝජනාවට සම්පූර්ණ හේතුව මෙයයි.
විමර්ශනය කරමු
ගොඩවල් වෙන් කිරීම, මිණුම් සලකුණු පරීක්ෂණ, RAM, හැඹිලි සහ පිටු ලිපිගොනු දෙස බැලීමෙන් බොහෝ දෙනෙක් දැනටමත් මෙය කර ඇති බව දැනටමත් පෙනේ. නිශ්චිත දත්ත ලක්ෂ්යයන් දෙස බැලීමේදී සහ නිශ්චිත පුනරාවර්තන දර්ශක ද ඇතුළත් කර ඇති අතර මෙම විශේෂිත ගැටළුව පිළිබඳ විවිධ සංවාදයන් බොහෝ දෙනෙකුට ඒ හා සම්බන්ධ වෙනත් කරුණු ප්රශ්න කිරීමට පටන් ගෙන තිබේ. ගණිතමය ඇල්ගොරිතම භාවිතා කරමින් එයට ප්රතිසමයක් යෙදීමෙන් අපි මෙම ගැටලුව දෙස බැලීමට පටන් ගන්නේ කෙසේද? අපි ප්රකාශ කිහිපයක් ඉදිරිපත් කිරීමෙන් ආරම්භ කරමු! ඉන්පසු අපි අපගේ ඇල්ගොරිතම එතැනින් ගොඩනගා ගනිමු.
අපගේ ප්රකාශ:
- අපගේ ලූපය සහ එහි පුනරාවර්තනයන් 1 සිට ආරම්භ කර 100000 කින් අවසන් වන අතර එය ලූපවල මෙන් 0 සමඟ ආරම්භ වනවා සේම අපි මතක තබා ගත යුතු බැවින් මතක ඇමතීමේ 0 සුචිගත කිරීමේ යෝජනා ක්රමය ගැන කරදර විය යුතු නැත. ඇල්ගොරිතම ම ය.
- මෙම අවස්ථා දෙකෙහිම අපට වැඩ කිරීමට කාර්යයන් 4 ක් සහ ක්රියාකාරී ඇමතුම් 2 ක් ඇත. අප පහත සඳහන් ලෙස කටයුතු කිරීමට ඇති කාර්යයන් හා ඇමතුම් ලෙස මෙම සකස් කරනු ඇත:
F1()
, F2()
, f(a)
, f(b)
, f(c)
හා f(d)
.
ඇල්ගොරිතම:
1 වන අවස්ථාව: - එක් සාරාංශයක් පමණක් නොව ස්වාධීන ශ්රිත ඇමතුම් දෙකක් පමණි.
Sum n=1 : [1,100000] = F1(), F2();
F1() = { f(a) = f(a) + f(b); }
F2() = { f(c) = f(c) + f(d); }
2 වන අවස්ථාව: - සාරාංශ දෙකක් නමුත් සෑම එකක්ම තමන්ගේම ක්රියාකාරී ඇමතුමක් ඇත.
Sum1 n=1 : [1,100000] = F1();
F1() = { f(a) = f(a) + f(b); }
Sum2 n=1 : [1,100000] = F1();
F1() = { f(c) = f(c) + f(d); }
ඔබ දැක නම් F2()
පමණක් පවතී Sum
සිට Case1
එහිදී F1()
අඩංගු Sum
සිට Case1
හා දෙකේම Sum1
හා Sum2
සිට Case2
. දෙවන ඇල්ගොරිතම තුළ සිදුවන ප්රශස්තිකරණයක් ඇති බව අප නිගමනය කිරීමට පටන් ගත් විට මෙය පසුව පැහැදිලි වනු ඇත.
පළමු සිද්ධි Sum
ඇමතුම් හරහා පුනරාවර්තනයන් f(a)
එහි ආත්මයට එකතු වන අතර f(b)
පසුව එය ඇමතුම f(c)
එකම දේ කරන නමුත් එක් f(d)
එක් 100000
පුනරාවර්තන සඳහා එයම එකතු කරයි . දෙවන අවස්ථාවෙහිදී, අප සතුව ඇති Sum1
අතර Sum2
දෙකම එක හා සමානව ක්රියා කරන අතර ඒවා එකම ශ්රිතයක් ලෙස දෙවරක් කැඳවනු ලැබේ.
මෙම අවස්ථාවේ දී අප ප්රතිකාර කළ හැක Sum1
සහ Sum2
පමණක් සරල පැරණි ලෙස Sum
එහිදී Sum
මේ වගේ මෙම නඩුවේ පෙනුම: Sum n=1 : [1,100000] { f(a) = f(a) + f(b); }
අපි හිතුවා ඒ එකම කාර්යය විය සලකා කළ හැකි උපරිම ඵල නෙළා වැනි දැන් මෙම පෙනුම.
ප්රතිසම සමඟ සාරාංශය
දෙවන අවස්ථාවෙහිදී අප දුටු දෙයින් පෙනෙන්නේ ලූප සඳහා දෙකම එකම නිශ්චිත අත්සනක් ඇති බැවින් ප්රශස්තිකරණයක් ඇති බවයි. නමුත් මෙය සැබෑ ගැටළුව නොවේ. ප්රශ්නය විසින් සිදු කරන ලැබ ඇත ක්රියාකාරකම් නොවේ f(a)
, f(b)
, f(c)
, සහ f(d)
. අවස්ථා දෙකේදීම සහ දෙක අතර සංසන්දනය, එය එක් එක් අවස්ථාවෙහිදී සාරාංශය ගමන් කළ යුතු දුරෙහි වෙනස වන අතර එය ක්රියාත්මක කිරීමේ වේලාවේ වෙනස ඔබට ලබා දෙයි.
ඒ පිළිබඳව ද For Loops
මෙම ලෙස Summations
එය ලෙස ඒ අනුකරණ කරන්නේ බව Boss
දෙදෙනෙක් නියෝග ලබා දෙන A
සහ B
ඔවුන්ගේ රැකියා මස් බව C
සහ D
පිළිවෙළින් සහ ඔවුන්ගෙන් සමහර පැකේජය තෝරාගන්න එය නැවත එන්න. මෙම ප්රතිසමයේ දී, ලූප හෝ සාරාංශ පුනරාවර්තන සහ තත්ව පරීක්ෂාවන් සඳහා සත්ය වශයෙන්ම නියෝජනය නොවේ Boss
. දේ ඇත්තටම නියෝජනය Boss
සෘජුවම සැබෑ ගණිතමය ගණිත ක්රමයක් නොවන නමුත් සැබෑ සංකල්පය සිට Scope
හා Code Block
පුරුද්දක් හෝ subroutine තුළ, ක්රමය, කර්තව්යයක්, පරිවර්තන ඒකකය, ආදිය පළමු ඇල්ගොරිතමය 2 වන ඇල්ගොරිතම අඛණ්ඩව විෂය පථ 2 වේ එහිදී 1 විෂය පථය වේ.
එක් එක් ඇමතුමක් ස්ලිප් මත පළමු අවස්ථාවේදී ඇතුලත, Boss
යයි A
ද නම් ලබා දෙන හා A
ලබා ගැනීමට ඇති වෙනවා B's
පැකේජය පසුව Boss
යයි C
ද නියෝග එසේ සිට පැකේජය ලබා ගැනීමට ලබා දෙන D
එක් එක් ප්රතිඵලය මත.
දෙවන අවස්ථාව තුළ, සියලු පැකේජ ලැබෙන තුරු පැකේජය ලබා ගැනීමට Boss
කෙලින්ම ක්රියා කරයි . එවිට සියලු පැකේජ ලබා ගැනීම සඳහා එකම දේ කිරීමට කටයුතු කරයි .A
B's
Boss
C
D's
අපි බයිට් 8 ක දර්ශකයක් සමඟ වැඩ කරන අතර ගොඩවල් වෙන් කිරීම සමඟ කටයුතු කරන බැවින් පහත සඳහන් ගැටලුව සලකා බලමු. බව අපි එකතු කියා Boss
සිට අඩි 100 A
හා A
අඩි 500 ක් වේ C
. මරණ ද of ුවම නියම වීම නිසා Boss
මුලදී එය කොතරම් දුරද යන්න ගැන අපට කරදර විය යුතු නැත C
. අවස්ථා දෙකේදීම, Boss
මුලින් ගමන් කරන්නේ මුල සිට A
එතැන් සිටය B
. මෙම ප්රතිසමය මෙම දුර නිශ්චිත යැයි කීම නොවේ; එය ඇල්ගොරිතම වල ක්රියාකාරිත්වය පෙන්වීමට ප්රයෝජනවත් පරීක්ෂණ අවස්ථාවකි.
බොහෝ අවස්ථාවන්හීදී, ගොඩවල් වෙන් කිරීම සහ හැඹිලි සහ පිටු ලිපිගොනු සමඟ වැඩ කිරීමේදී, ලිපින ස්ථාන අතර මෙම දුර ප්රමාණය එතරම් වෙනස් නොවිය හැකිය හෝ දත්ත වර්ගවල ස්වභාවය සහ අරාව ප්රමාණ අනුව ඒවා සැලකිය යුතු ලෙස වෙනස් විය හැකිය.
පරීක්ෂණ අවස්ථා:
පළමු නඩු: පළමු ප්රතිඵලය මත මෙමBoss
මුලින් නියෝග ස්ලිප් දෙන්න අඩි 100 යෑමට සිදු වී ඇතිA
සහA
ලකුණු ගොස් ඔහුගේ දෙයක් කරනවා, ඒත් දැන්Boss
අඩි 500 ක් දක්වා ගමන් කිරීමට ඇතිC
ඔහු තම නියෝගය ස්ලිප් දෙන්න. ඊළඟ පුනරාවර්තනය සහ අනෙක් සෑමBoss
නැවත නැවත සිදුකිරීමේදී දෙදෙනා අතර අඩි 500 ක් ඉදිරියට හා පසුපසට යා යුතුය.
දෙවන නඩු: මෙමBoss
පළමු ප්රතිඵලය මත අඩි 100 ගමන් කිරීමට ඇතිA
, නමුත් ඊට පස්සේ, ඔහු එහි දැනටමත් සඳහා පමණක් ඔබා එයA
සියලු ස්ලිප් පිරී තෙක් නැවත ලබා ගැනීමට. එවිටBoss
පළමු ප්රතිඵලය මත අඩි 500 ගමන් කිරීමට ඇතිC
නිසාC
සිට අඩි 500 ක් වේA
. මෙයඔහුBoss( Summation, For Loop )
සමඟ වැඩ කිරීමෙන් පසු වහාම කැඳවනු ලබනබැවින්,ඇණවුම් ස්ලිප් සියල්ල සිදු වනතුරුA
ඔහු කළ ආකාරයටම ඔහු එහිA
රැඳීC's
සිටී.
ගමන් කළ දුරවල වෙනස
const n = 100000
distTraveledOfFirst = (100 + 500) + ((n-1)*(500 + 500);
// Simplify
distTraveledOfFirst = 600 + (99999*100);
distTraveledOfFirst = 600 + 9999900;
distTraveledOfFirst = 10000500;
// Distance Traveled On First Algorithm = 10,000,500ft
distTraveledOfSecond = 100 + 500 = 600;
// Distance Traveled On Second Algorithm = 600ft;
අත්තනෝමතික වටිනාකම් සංසන්දනය කිරීම
600 ක් මිලියන 10 ට වඩා බෙහෙවින් අඩු බව අපට පහසුවෙන් දැක ගත හැකිය. දැන්, මෙය හරියටම නොවේ, මන්ද යත්, RAM හි ලිපිනය හෝ හැඹිලිය හෝ පිටු ගොනුව අතර ඇති දුරෙහි සැබෑ වෙනස අප නොදන්නා නිසා එක් එක් නැවතීමේ සෑම ඇමතුමක්ම නොපෙනෙන බොහෝ විචල්යයන් නිසා සිදුවනු ඇත. මෙය තත්වය පිළිබඳව දැනුවත්ව සිටීම හා නරකම අවස්ථාව දෙස බැලීම පමණි.
මෙම සංඛ්යා වලින් එය බොහෝ දුරට පෙනෙනුයේ ඇල්ගොරිතම 1 99%
ඇල්ගොරිතම දෙකට වඩා මන්දගාමී විය යුතුය ; කෙසේ වෙතත්, මෙය Boss's
ඇල්ගොරිතම වල කොටසක් හෝ වගකීමක් පමණක් වන අතර එය සැබෑ කම්කරුවන් A
, B
සහ C
, සහ D
ලූපයේ සෑම ක්රියාවලියක් සඳහාම ඔවුන් කළ යුතු දේ පිළිබඳව ගණන් නොගනී . එබැවින් ලොක්කාගේ රැකියාව සිදු කරනු ලබන්නේ සම්පූර්ණ වැඩ වලින් 15 - 40% ක් පමණි. කම්කරුවන් හරහා සිදු කරනු ලබන කාර්යයන්ගෙන් වැඩි ප්රමාණයක් වේග අනුපාත වෙනස 50-70% දක්වා තබා ගැනීම කෙරෙහි තරමක් විශාල බලපෑමක් ඇති කරයි
නිරීක්ෂණය: - ඇල්ගොරිතම දෙක අතර වෙනස්කම්
මෙම තත්වය තුළ, එය සිදු කරනු ලබන කාර්යයේ ව්යුහය වේ. සමාන ක්රියාකාරී ප්රකාශයක් සහ අර්ථ දැක්වීමක් ඇති අර්ධ ප්රශස්තිකරණයෙන් කේස් 2 වඩාත් කාර්යක්ෂම බව පෙන්වීමට එය යන්නේ නම සහ ගමන් කළ දුර අනුව වෙනස් වන විචල්යයන් පමණි.
ඒ වගේම අපි ගමන් මුළු දුර බව දකින්න නඩු 1 වඩා තවත් එහි ඇති වඩා නඩු 2 අපි මේ දුර, අපේ ගමන් සලකා බැලිය හැකි කාල සාධකය වන ගණිත ක්රමයක් දෙක අතර. නඩුව 1 ට වඩා කරන්න සැලකිය යුතු වැඩි කරන වැඩ නඩුව 2 කරන්නේ.
මෙම ASM
අවස්ථා දෙකෙහිම පෙන්වා ඇති උපදෙස් වල සාක්ෂි වලින් මෙය නිරීක්ෂණය කළ හැකිය . මෙම නඩු ගැන දැනටමත් සඳහන් දේ සමග, මේ බව සඳහා වැයවේ නැත නඩු 1 ලොක්කා යන දෙකම සඳහා බලා සිටීමට සිදු වනු ඇත A
සහ C
ඔහු ආපසු ගමන් කිරීමට පෙර ආපසු ලබා ගැනීමට A
සේම සෑම සඳහා නැවත. අතිශය දීර් time කාලයක් ගත වුවහොත් A
හෝ අනෙක් සේවකයා (ව) ක්රියාත්මක කිරීමට අක්රියව සිටින බවට ද එය ගණන් නොගනී .B
Boss
දී නඩු 2 එකම එක් දැරියක අලස වේ Boss
කම්කරුවා නැවත පැමිණෙන තුරු. එබැවින් මෙය පවා ඇල්ගොරිතම කෙරෙහි බලපෑමක් ඇති කරයි.
OPs සංශෝධිත ප්රශ්නය (ය)
සංස්කරණය කරන්න: හැසිරීම අරා (n) සහ CPU හැඹිලියේ ප්රමාණයන් මත දැඩි ලෙස රඳා පවතින බැවින් ප්රශ්නය කිසිදු අදාල නොවේ. එබැවින් වැඩි උනන්දුවක් ඇත්නම්, මම ප්රශ්නය නැවත ලියමි:
පහත දැක්වෙන ප්රස්ථාරයේ කලාප පහ විසින් නිරූපණය කර ඇති පරිදි විවිධ හැඹිලි හැසිරීම් වලට තුඩු දෙන විස්තර පිළිබඳව ඔබට යම් අවබෝධයක් ලබා දිය හැකිද?
මෙම CPU සඳහා සමාන ප්රස්ථාරයක් ලබා දීමෙන් CPU / හැඹිලි ගෘහ නිර්මාණ ශිල්පය අතර ඇති වෙනස්කම් පෙන්වා දීම සිත්ගන්නා සුළු විය හැකිය.
මෙම ප්රශ්න සම්බන්ධයෙන්
මා සැකයකින් තොරව නිරූපණය කර ඇති පරිදි, දෘඩාංග හා මෘදුකාංග සම්බන්ධ වීමට පෙර පවා යටින් පවතින ගැටලුවක් තිබේ.
පිටු ලිපිගොනු ආදිය සමඟ මතකය සහ හැඹිලිය කළමනාකරණය කිරීම සඳහා පහත සඳහන් කරුණු අතර ඒකාබද්ධ පද්ධති සමූහයක් තුළ සියල්ල එකට වැඩ කරයි:
The Architecture
{දෘඩාංග, ස්ථිරාංග, කාවැද්දූ ධාවක, කර්නල් සහ ASM උපදෙස් කට්ටල}.
The OS
{ගොනු සහ මතක කළමනාකරණ පද්ධති, රියදුරන් සහ ලේඛකාධිකාරය}.
The Compiler
Code පරිවර්තන ඒකක සහ ප්රභව කේතයේ ප්රශස්තිකරණය}.
Source Code
සුවිශේෂී ඇල්ගොරිතම සමූහයක් සමඟ පවා .
අපි පවා අත්තනෝමතික සමග කිසිම යන්ත්රයක් එය අදාළ පෙර පළමු ඇල්ගොරිතමය තුළ සිදු වන බව භාධකයක් ඇති බව අප දැනටමත් දැක ගැනීමට හැකි වන Architecture
, OS
හා Programmable Language
දෙවන ඇල්ගොරිතමය සාපේක්ෂව. නවීන පරිගණකයක සහජයෙන්ම සම්බන්ධ වීමට පෙර දැනටමත් ගැටලුවක් තිබේ.
අවසන් ප්රති .ල
කෙසේවෙතත්; මෙම නව ප්රශ්න වැදගත් නොවන බව කීම නොවේ, මන්ද ඒවා ඔවුන්ම වන අතර ඒවා සියල්ලටම පසුව කාර්යභාරයක් ඉටු කරයි. ඒවා ක්රියාපටිපාටියට හා සමස්ත ක්රියාකාරිත්වයට බලපෑම් කරන අතර ඔවුන්ගේ පිළිතුරු (පිළිතුරු) සහ අදහස් දැක්වීම් ලබා දී ඇති බොහෝ අයගේ විවිධ ප්රස්ථාර සහ ඇගයීම්වලින් එය පැහැදිලි වේ.
ඔබ පිළිබඳ නිදර්ශනය අවධානය යොමු නම් Boss
සහ සේවකයන් දෙදෙනෙක් A
සහ B
කරන ඇසුරුම් ගොස් යළි ලබාගැනීම සඳහා ඇති C
සහ D
පිළිවෙළින් ප්රශ්නයට ගණිත ක්රමයක් දෙකක් ගණිතමය අංකන සලකා; පරිගණක දෘඩාංග සම්බන්ධ නොවී ඔබට දැකිය හැකි අතර මෘදුකාංගය Case 2
ආසන්න වශයෙන් 60%
වඩා වේගවත් වේ Case 1
.
මෙම ඇල්ගොරිතම කිසියම් ප්රභව කේතයකට යොදන ලද පසු, ප්රස්ථාර සහ ප්රස්ථාර දෙස බැලූ විට, ලබා දී ඇති දෘඩාංග කැබැල්ලක ක්රියාකාරිත්වය සිදු කිරීම සඳහා මෙහෙයුම් පද්ධතිය හරහා සම්පාදනය කර, ප්රශස්තිකරණය කර ක්රියාත්මක කළ විට, වෙනස්කම් අතර තව ටිකක් පිරිහීමක් ඔබට දැකිය හැකිය. මෙම ඇල්ගොරිතම වල.
නම් Data
කට්ටලයක් තරමක් කුඩා වන එය පළමු වෙනසක් සියලු නරක දෙයක් විය හැක. කෙසේ වෙතත්, පසුව Case 1
ක් පමණ වන 60 - 70%
මන්දගාමී වඩා Case 2
අපි කාලය මරණ දඬුවම් පැමිණවීමෙහි වෙනස්කම් අනුව මෙම ශ්රිතය වර්ධනය දෙස බලා සිටිය හැක:
DeltaTimeDifference approximately = Loop1(time) - Loop2(time)
//where
Loop1(time) = Loop2(time) + (Loop2(time)*[0.6,0.7]) // approximately
// So when we substitute this back into the difference equation we end up with
DeltaTimeDifference approximately = (Loop2(time) + (Loop2(time)*[0.6,0.7])) - Loop2(time)
// And finally we can simplify this to
DeltaTimeDifference approximately = [0.6,0.7]*Loop2(time)
මෙම දළ විශ්ලේෂණය ඇල්ගොරිතම සහ මෘදුකාංග ප්රශස්තිකරණය සහ යන්ත්ර උපදෙස් සම්බන්ධ යන්ත්ර මෙහෙයුම් අතර මෙම ලූප දෙක අතර සාමාන්ය වෙනසයි.
දත්ත කට්ටලය රේඛීයව වර්ධනය වන විට, දෙක අතර කාලයෙහි වෙනස ද එසේමය. ඇල්ගොරිතමය 1 ඇල්ගොරිතමය 2 ට වඩා වැඩි මිලක් ඇති වූ විට පැහැදිලි වන Boss
සංචාරක සහ පසුපසට අතර උපරිම දුර යුතු A
සහ C
පළමු ප්රතිඵලයක්ම පසු සෑම ප්රතිඵලයක්ම සඳහා ඇල්ගොරිතම 2 අතර, Boss
ගමන් කිරීමට ඇති A
එක් වරක් හා පසුව සිදු කිරීමෙන් පසු A
ඔහු ගමන් කිරීමට ඇති සිට යන විට එකම එක කාලය උපරිම දුර A
කිරීමට C
.
Boss
එක හා සමාන කාර්යයන් දෙකක් එකවර සිදු කිරීම කෙරෙහි අවධානය යොමු කිරීමට උත්සාහ කිරීම හා ඒ හා සමාන අඛණ්ඩ කාර්යයන් කෙරෙහි අවධානය යොමු කරනවා වෙනුවට ඒවා ඉදිරියට හා පසුපසට තල්ලු කිරීම, ඔහුට සංචාරය කිරීමට හා දෙගුණයක් වැඩ කිරීමට සිදු වූ බැවින් දවස අවසානයේදී ඔහු තරමක් කෝපයට පත් වනු ඇත. එම නිසා ලොක්කාගේ සහකරු හෝ සහකාරිය සහ දරුවන් එය අගය නොකරන හෙයින් ඔබේ ලොක්කාට අන්තර් සම්බන්ධිත බාධකයකට පැටලීමෙන් තත්වයේ විෂය පථය අහිමි නොකරන්න.
සංශෝධනය: මෘදුකාංග ඉංජිනේරු සැලසුම් මූලධර්ම
- ලූප සඳහා පුනරාවර්තනය තුළ ඇති ගණනය කිරීම් අතර වෙනස Local Stack
සහ Heap Allocated
ඒවායේ භාවිතයන්, ඒවායේ කාර්යක්ෂමතාව සහ effectiveness ලදායීතාවය අතර වෙනස -
මා ඉහත යෝජනා කළ ගණිතමය ඇල්ගොරිතම ප්රධාන වශයෙන් අදාළ වන්නේ ගොඩවල් මත වෙන් කර ඇති දත්ත මත මෙහෙයුම් සිදුකරන ලූපවලට ය.
- අඛණ්ඩ තොග මෙහෙයුම්:
- ලූප තනි දත්ත කේතයක් තුළ හෝ තොග රාමුව තුළ ඇති දත්ත මත දේශීයව මෙහෙයුම් සිදු කරන්නේ නම්, එය තවමත් අදාළ වේ, නමුත් මතක ස්ථාන ඒවා සාමාන්යයෙන් අනුක්රමික වන ස්ථානයට වඩා සමීප වන අතර දුර ගමන් හෝ ක්රියාත්මක කිරීමේ වේලාවේ වෙනස බොහෝ දුරට නොසැලකිලිමත් ය. ගොඩවල් තුළ කිසිදු ප්රතිපාදනයක් සිදු නොවන බැවින්, මතකය විසිරී නොයන අතර, මතකය බැටළුවා හරහා ලබා නොගනී. මතකය සාමාන්යයෙන් අනුක්රමික වන අතර තොග රාමුවට හා තොග දර්ශකයට සාපේක්ෂව වේ.
- තොගයේ අඛණ්ඩව මෙහෙයුම් සිදුකරන විට, නවීන ප්රොසෙසරයක් මඟින් පුනරාවර්තන අගයන් සහ දේශීය හැඹිලි ලේඛනයේ මෙම අගයන් රඳවා තබා ගනී. මෙහි මෙහෙයුම් හෝ උපදෙස් කාලය නැනෝ තත්පර අනුපිළිවෙල අනුව වේ.
- අඛණ්ඩ ගොඩවල් වෙන් කළ මෙහෙයුම්:
- ඔබ ගොඩවල් වෙන්කිරීම් ආරම්භ කරන විට සහ ප්රොසෙසරයට CPU, බස් පාලක සහ රාම් මොඩියුලවල ගෘහ නිර්මාණ ශිල්පය මත පදනම්ව අඛණ්ඩ ඇමතුම් මගින් මතක ලිපින ලබා ගත යුතුය. මෙහෙයුම් හෝ ක්රියාත්මක කිරීමේ කාලය මයික්රෝ සිට අනුපිළිවෙලට විය හැකිය. මිලි තත්පර. හැඹිලි තොග මෙහෙයුම් වලට සාපේක්ෂව මේවා තරමක් මන්දගාමී ය.
- CPU විසින් රාම් වෙතින් මතක ලිපිනය ලබා ගත යුතු අතර සාමාන්යයෙන් පද්ධති බස් රථය හරහා ඇති ඕනෑම දෙයක් CPU තුළ ඇති අභ්යන්තර දත්ත මාර්ග හෝ දත්ත බස් වලට සාපේක්ෂව මන්දගාමී වේ.
එබැවින් ඔබ ගොඩවල් මත තිබිය යුතු දත්ත සමඟ වැඩ කරන විට සහ ඔබ ඒවා හරහා ලූප හරහා ගමන් කරන විට, එක් එක් දත්ත කට්ටලය සහ ඊට අනුරූප ඇල්ගොරිතම එහි තනි පුඩුවක් තුළ තබා ගැනීම වඩාත් කාර්යක්ෂම වේ. ගොඩවල් මත ඇති විවිධ දත්ත කට්ටලවල බහුවිධ මෙහෙයුම් තනි පුඩුවක් තුළට දැමීමෙන් අඛණ්ඩ ලූප සාධක කිරීමට උත්සාහ කිරීම හා සසඳන විට ඔබට වඩා හොඳ ප්රශස්තිකරණයක් ලැබෙනු ඇත.
ඒවා නිතරම හැඹිලිගත කර ඇති බැවින් තොගයේ ඇති දත්ත සමඟ මෙය කිරීම කමක් නැත, නමුත් එහි මතක ලිපිනය තිබිය යුතු දත්ත සඳහා සෑම පුනරාවර්තනයක්ම විමසා බැලිය යුතුය.
මෘදුකාංග ඉංජිනේරු සහ මෘදුකාංග ගෘහ නිර්මාණ සැලසුම් ක්රියාත්මක වන්නේ මෙහිදීය. එය ඔබගේ දත්ත සංවිධානය කරන්නේ කෙසේදැයි දැන ගැනීමට ඇති හැකියාව, ඔබේ දත්ත හැඹිලිගත කරන්නේ කවදාදැයි දැන ගැනීම, ඔබේ දත්ත ගොඩවල් මත වෙන් කළ යුත්තේ කවදාදැයි දැන ගැනීම, ඔබේ ඇල්ගොරිතම සැලසුම් කර ක්රියාත්මක කරන්නේ කෙසේදැයි දැන ගැනීම සහ ඒවා අමතන්නේ කවදාද සහ කොතැනද යන්න දැන ගැනීමයි.
එකම දත්ත කට්ටලයට අදාළ ඇල්ගොරිතම ඔබ සතුව තිබිය හැකි නමුත්, O(n)
වැඩ කරන විට ඇල්ගොරිතමයේ සංකීර්ණතාවයෙන් දැකිය හැකි ඉහත ගැටලුව නිසාම, එහි කොටස් ප්රභේදය සඳහා එක් ක්රියාත්මක කිරීමේ සැලසුමක් සහ තවත් ගොඩවල් වෙන් කරන ලද ප්රභේදය සඳහා ඔබට අවශ්ය විය හැකිය. ගොඩවල් සමඟ.
වසර ගණනාවක් තිස්සේ මා දුටු දෙයින් බොහෝ දෙනෙක් මෙම කාරණය සැලකිල්ලට නොගනිති. ඔවුන් විශේෂිත දත්ත කට්ටලයක් මත ක්රියා කරන එක් ඇල්ගොරිතමයක් සැලසුම් කිරීමට නැඹුරු වන අතර දත්ත කට්ටලය තොගයේ දේශීයව හැඹිලිගත කර හෝ එය ගොඩවල් මත වෙන් කර ඇත්ද යන්න නොසලකා ඔවුන් එය භාවිතා කරනු ඇත.
ඔබට සත්ය ප්රශස්තිකරණය අවශ්ය නම්, ඔව් එය කේත අනුපිටපතක් සේ පෙනේ, නමුත් සාමාන්යකරණය කිරීම සඳහා එකම ඇල්ගොරිතමයේ ප්රභේද දෙකක් තිබීම වඩාත් කාර්යක්ෂම වනු ඇත. එකක් තොග මෙහෙයුම් සඳහා වන අතර අනෙක පුනරාවර්තන ලූපවල සිදු කරන ගොඩවල් මෙහෙයුම් සඳහා!
මෙන්න ව්යාජ උදාහරණයක්: සරල ව්යුහ දෙකක්, එක් ඇල්ගොරිතමයක්.
struct A {
int data;
A() : data{0}{}
A(int a) : data{a}{}
};
struct B {
int data;
B() : data{0}{}
A(int b) : data{b}{}
}
template<typename T>
void Foo( T& t ) {
// do something with t
}
// some looping operation: first stack then heap.
// stack data:
A dataSetA[10] = {};
B dataSetB[10] = {};
// For stack operations this is okay and efficient
for (int i = 0; i < 10; i++ ) {
Foo(dataSetA[i]);
Foo(dataSetB[i]);
}
// If the above two were on the heap then performing
// the same algorithm to both within the same loop
// will create that bottleneck
A* dataSetA = new [] A();
B* dataSetB = new [] B();
for ( int i = 0; i < 10; i++ ) {
Foo(dataSetA[i]); // dataSetA is on the heap here
Foo(dataSetB[i]); // dataSetB is on the heap here
} // this will be inefficient.
// To improve the efficiency above, put them into separate loops...
for (int i = 0; i < 10; i++ ) {
Foo(dataSetA[i]);
}
for (int i = 0; i < 10; i++ ) {
Foo(dataSetB[i]);
}
// This will be much more efficient than above.
// The code isn't perfect syntax, it's only psuedo code
// to illustrate a point.
ගොඩවල් ප්රභේදවලට එදිරිව තොග ප්රභේද සඳහා වෙනම ක්රියාත්මක කිරීම මගින් මා සඳහන් කළේ මෙයයි. ඇල්ගොරිතමයන්ම එතරම් වැදගත් නැත, එය ඔබ ඒවා භාවිතා කරන ලූප ව්යුහයන් වේ.