මම ස්විෆ්ට් බීටා හි ඇල්ගොරිතමයක් ක්රියාත්මක කරමින් සිටියදී එහි ක්රියාකාරිත්වය ඉතා දුර්වල බව දුටුවෙමි. ගැඹුරට හාරා බැලීමෙන් පසු මට වැටහී ගියේ එක් බාධකයක් අරා වර්ග කිරීම තරම් සරල දෙයක් බවයි. අදාළ කොටස මෙහි ඇත:
let n = 1000000
var x = [Int](repeating: 0, count: n)
for i in 0..<n {
x[i] = random()
}
// start clock here
let y = sort(x)
// stop clock here
C ++ හි, ඒ හා සමාන මෙහෙයුමක් මගේ පරිගණකයේ 0.06s ගනී .
පයිතන්හිදී, එය 0.6s ගනී (උපක්රම නැත, පූර්ණ සංඛ්යා ලැයිස්තුවක් සඳහා y = වර්ග කළ (x) පමණි).
පහත දැක්වෙන විධානය සමඟ මම එය සම්පාදනය කරන්නේ නම් ස්විෆ්ට්හිදී 6s ගත වේ :
xcrun swift -O3 -sdk `xcrun --show-sdk-path --sdk macosx`
මම එය පහත දැක්වෙන විධානය සමඟ සම්පාදනය කරන්නේ නම් එය 88s තරම් කාලයක් ගතවේ :
xcrun swift -O0 -sdk `xcrun --show-sdk-path --sdk macosx`
Xcode හි "මුදා හැරීම" එදිරිව "නිදොස් කිරීම" සමඟ කාලය සමාන වේ.
මෙහි වැරැද්ද කුමක්ද? C ++ හා සැසඳීමේදී මට යම් කාර්ය සාධන අලාභයක් තේරුම් ගත හැකි නමුත් පිරිසිදු පයිතන් හා සසඳන විට 10 ගුණයක මන්දගාමී වීමක් නොවේ.
සංස්කරණය කරන්න: කාලගුණය වෙනස් බව දැක -O3
ගැනීමට -Ofast
මෙම කේතය ලකුණු පාහේ තරම් වේගයෙන් C ++ අනුවාදය ලෙස වෙයි! කෙසේ වෙතත්, -Ofast
භාෂාවේ අර්ථ නිරූපණය බොහෝ වෙනස් කරයි - මගේ පරීක්ෂණයේදී, එය පූර්ණ සංඛ්යා පිටාර ගැලීම් සහ අරාව සුචිගත කිරීමේ පිටාර ගැලීම් සඳහා වූ චෙක්පත් අක්රීය කළේය . නිදසුනක් ලෙස, -Ofast
පහත දැක්වෙන ස්විෆ්ට් කේතය බිඳ වැටීමකින් තොරව නිහ ly ව ක්රියාත්මක වේ (සහ සමහර කසළ මුද්රණය කරයි):
let n = 10000000
print(n*n*n*n*n)
let x = [Int](repeating: 10, count: n)
print(x[n])
ඒ නිසා -Ofast
අපට අවශ්ය දේ නොවේ; ස්විෆ්ට්හි සමස්ත කරුණ නම් අප සතුව ආරක්ෂිත දැල් තිබීමයි. ඇත්ත වශයෙන්ම, ආරක්ෂිත දැල් කාර්ය සාධනය කෙරෙහි යම් බලපෑමක් ඇති කරයි, නමුත් ඒවා වැඩසටහන් 100 ගුණයකින් මන්දගාමී නොකළ යුතුය. ජාවා දැනටමත් අරාව මායිම් පරීක්ෂා කර ඇති බව මතක තබා ගන්න, සාමාන්ය අවස්ථාවන්හිදී මන්දගාමී වීම 2 ට වඩා අඩු සාධකයකි. තවද ක්ලැන්ග් සහ ජීසීසී හි -ftrapv
පූර්ණ සංඛ්යා පිටාර ගැලීම් පරීක්ෂා කිරීම සඳහා අපට ලැබී ඇති අතර එය එතරම් මන්දගාමී නොවේ.
එබැවින් ප්රශ්නය: ආරක්ෂිත දැල් අහිමි නොවී ස්විෆ්ට් හි සාධාරණ කාර්ය සාධනයක් ලබා ගන්නේ කෙසේද?
2 වන සංස්කරණය: මම තවත් මිණුම් සලකුණු කිහිපයක් කළෙමි
for i in 0..<n {
x[i] = x[i] ^ 12345678
}
(මෙහි xor මෙහෙයුම ඇත්තේ එකලස් කිරීමේ කේතයේ අදාළ ලූපය වඩාත් පහසුවෙන් සොයාගත හැකි වන පරිදිය. මම පහසුවෙන් හඳුනාගත හැකි මෙහෙයුමක් තෝරා ගැනීමට උත්සාහ කළෙමි. පූර්ණ සංඛ්යා පිටාර ගැලීමට.)
නැවතත්, -O3
සහ අතර කාර්ය සාධනයෙහි විශාල වෙනසක් සිදුවිය -Ofast
. ඒ නිසා මම එකලස් කිරීමේ කේතය දෙස බැලුවෙමි:
සමග
-Ofast
මම බලාපොරොත්තු වන්නේ කුමක්ද එච්චරමයි ලබා ගන්න. අදාළ කොටස යන්ත්ර භාෂා උපදෙස් 5 ක් සහිත ලූපයකි.සමග
-O3
මම මගේ වියරු පරිකල්පනය ඔබ්බට හැකි දෙයක් ලබා ගන්න. අභ්යන්තර ලූප එකලස් කිරීමේ කේතයේ පේළි 88 ක් විහිදේ. මම ඒ සියල්ල තේරුම් ගැනීමට උත්සාහ නොකළ නමුත් වඩාත්ම සැක සහිත කොටස් වන්නේ "callq _swift_retain" හි ආයාචනා 13 ක් සහ "callq _swift_release" හි තවත් ආයාචනා 13 කි. එනම්, අභ්යන්තර පුඩුවේ සබ්ට්රවුටින් ඇමතුම් 26 ක් !
3 වන සංස්කරණය: අදහස් දැක්වීමේදී, ෆෙරුසියෝ විසින් ගොඩනඟන ලද කාර්යයන් (උදා. වර්ග කිරීම) මත රඳා නොසිටින අර්ථයෙන් සාධාරණ මිණුම් සලකුණු ඉල්ලා සිටියේය. මම හිතන්නේ පහත වැඩසටහන තරමක් හොඳ උදාහරණයක්:
let n = 10000
var x = [Int](repeating: 1, count: n)
for i in 0..<n {
for j in 0..<n {
x[i] = x[j]
}
}
අංක ගණිතයක් නොමැත, එබැවින් පූර්ණ සංඛ්යා පිටාර ගැලීම් ගැන අපට කරදර විය යුතු නැත. අප කරන එකම දෙය වන්නේ අරාව යොමු කිරීම් ගොඩක් පමණි. ප්රති results ල මෙහි ඇත - ස්විෆ්ට්-ඕ 3 -ෆාස්ට් හා සසඳන විට 500 කට ආසන්න සාධකයකින් අහිමි වේ:
- C ++ -O3: 0.05 s
- C ++ -O0: 0.4 s
- ජාවා: 0.2 s
- PyPy සමඟ පයිතන්: 0.5 s
- පයිතන්: 12 ස
- ස්විෆ්ට් -ෆාස්ට්: 0.05 s
- ස්විෆ්ට්-ඕ 3: 23 සෙ
- ස්විෆ්ට් -O0: 443 s
(සම්පාදකයාට අර්ථ විරහිත ලූප මුළුමනින්ම ප්රශස්තිකරණය කළ හැකි යැයි ඔබ සිතන්නේ නම්, ඔබට එය උදා. ලෙස වෙනස් කළ හැකි අතර x[i] ^= x[j]
ප්රතිදානය කරන මුද්රණ ප්රකාශයක් එක් කරන්න x[0]
. මෙය කිසිවක් වෙනස් නොකරයි; වේලාවන් ඉතා සමාන වනු ඇත.)
ඔව්, මෙහි පයිතන් ක්රියාත්මක කිරීම මෝඩ පිරිසිදු පයිතන් ක්රියාත්මක කිරීමක් වන අතර එය අඟල් ලැයිස්තුවක් සහ ලූප සඳහා කූඩු කර ඇත. එය භාවිතයට නොගත් ස්විෆ්ට වඩා මන්දගාමී විය යුතුය . ස්විෆ්ට් සහ අරා සුචිගත කිරීම් සමඟ යමක් බරපතල ලෙස බිඳී ඇති බව පෙනේ.
සංස්කරණය 4: මෙම ගැටළු (මෙන්ම වෙනත් කාර්ය සාධන ගැටළු) Xcode 6 බීටා 5 හි සවි කර ඇති බව පෙනේ.
වර්ග කිරීම සඳහා, මට දැන් පහත වේලාවන් ඇත:
- clang ++ -O3: 0.06 s
- swiftc -Ofast: 0.1 s
- swiftc -O: 0.1 s
- swiftc: 4 s
කැදැලි වළළු සඳහා:
- clang ++ -O3: 0.06 s
- swiftc -Ofast: 0.3 s
- swiftc -O: 0.4 s
- swiftc: 540 s
අනාරක්ෂිත -Ofast
(අකා -Ounchecked
) භාවිතා කිරීමට තවදුරටත් හේතුවක් නොමැති බව පෙනේ ; සරල ලෙස -O
සමාන කේතයක් නිපදවයි.
xcrun --sdk macosx swift -O3
. එය කෙටි ය.