আমি সুইফ্ট বিটাতে একটি অ্যালগরিদম বাস্তবায়ন করছিলাম এবং লক্ষ্য করেছি যে পারফরম্যান্সটি খুব খারাপ। আরও গভীর খননের পরে আমি বুঝতে পারি যে বাধাগুলির মধ্যে একটি হ'ল অ্যারে বাছাইয়ের মতো সহজ কিছু। সম্পর্কিত অংশটি এখানে:
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
সি ++ তে, একই ধরণের অপারেশনটি 0.06s লাগে আমার কম্পিউটারে ।
পাইথনে এটি লাগে 0.6 (কোন ট্রিক্স নয়, পূর্ণসংখ্যার তালিকার জন্য কেবল y = সাজানো (এক্স))।
আমি নিম্নলিখিত কমান্ডটি দিয়ে সংকলন করলে সুইফটে এটি 6s লাগে :
xcrun swift -O3 -sdk `xcrun --show-sdk-path --sdk macosx`
আমি নিম্নলিখিত কমান্ডটি দিয়ে এটি সঙ্কলন করলে 88s এর মতো সময় লাগে :
xcrun swift -O0 -sdk `xcrun --show-sdk-path --sdk macosx`
"রিলিজ" বনাম "ডিবাগ" বিল্ডগুলির সাথে এক্সকোডের সময়গুলি একই রকম।
এখানে কি ভুল? আমি সি ++ এর সাথে তুলনা করে কিছু কার্যকারিতা ক্ষতি বুঝতে পেরেছিলাম, তবে খাঁটি পাইথনের তুলনায় 10-গুণ গতি কমছে না।
সম্পাদনা: আবহাওয়া লক্ষ্য করেছে যে এই কোডটি পরিবর্তন -O3
করা -Ofast
সি -+ সংস্করণ হিসাবে প্রায় দ্রুত চালায়! যাইহোক, -Ofast
ভাষার শব্দার্থবিজ্ঞানকে অনেক পরিবর্তন করে - আমার পরীক্ষায় এটি পূর্ণসংখ্যার ওভারফ্লো এবং অ্যারের সূচক ওভারফ্লোগুলির জন্য চেকগুলি অক্ষম করে । উদাহরণস্বরূপ, -Ofast
নীচের সুইফট কোডটি ক্র্যাশ না করে নীরবে চলে (এবং কিছু আবর্জনা ছাপিয়ে):
let n = 10000000
print(n*n*n*n*n)
let x = [Int](repeating: 10, count: n)
print(x[n])
তাই -Ofast
আমরা কি চাই না; সুইফটের পুরো বিষয়টি হ'ল আমাদের কাছে সুরক্ষার জাল রয়েছে। অবশ্যই, সুরক্ষা জালগুলির পারফরম্যান্সে কিছুটা প্রভাব রয়েছে, তবে তাদের প্রোগ্রামগুলি 100 গুণ কম করা উচিত নয়। মনে রাখবেন যে জাভা ইতিমধ্যে অ্যারে বাউন্ডগুলি পরীক্ষা করে এবং সাধারণ ক্ষেত্রে, মন্দা 2 এর চেয়ে অনেক কম ফ্যাক্টর দ্বারা হয় And এবং কলং এবং জিসিসিতে আমরা পেয়েছি-ftrapv
(স্বাক্ষরিত) পূর্ণসংখ্যার ওভারফ্লোগুলি যাচাই করার জন্য , এবং এটি ধীর নয়।
তাই প্রশ্ন: সুরক্ষা জাল না হারিয়ে কীভাবে আমরা সুইফটে যুক্তিসঙ্গত পারফরম্যান্স পেতে পারি?
সম্পাদনা 2: আমি লাইনের সাথে খুব সাধারণ লুপগুলি সহ আরও কিছু বেঞ্চমার্কিং করেছি
for i in 0..<n {
x[i] = x[i] ^ 12345678
}
(এখানে জোর অপারেশনটি ঠিক আছে যাতে আমি আরও সহজেই সমাবেশ কোডে প্রাসঙ্গিক লুপটি সন্ধান করতে পারি I আমি এমন একটি অপারেশন বাছাই করার চেষ্টা করেছি যা স্পষ্ট করার পক্ষে সহজ তবে "নিরীহ" এই অর্থেও যে এটির জন্য কোনও চেকের প্রয়োজন নেই) পূর্ণসংখ্যার উপচে পড়তে।)
আবার, তার মাঝে কর্মক্ষমতা একটি বিশাল পার্থক্য ছিল -O3
এবং -Ofast
। সুতরাং আমি সমাবেশ কোডটি একবার দেখেছি:
সঙ্গে
-Ofast
আমি প্রায় কাছাকাছি আমি যা আশা পান। প্রাসঙ্গিক অংশটি 5 টি মেশিন ভাষার নির্দেশাবলী সহ একটি লুপ।এর সাথে
-O3
আমি এমন কিছু পেয়েছি যা আমার কল্পনার বাইরে ছিল। অভ্যন্তরীণ লুপটি সমাবেশ কোডের ৮৮ টি লাইনের বিস্তৃত। আমি এগুলি সব বোঝার চেষ্টা করি নি, তবে সর্বাধিক সন্দেহজনক অংশগুলি হ'ল "কলক _সুইফট_রেইন" এর 13 টি আহবান এবং "কলক _সুইফ্ট_রিলিজ" এর আরও 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]
}
}
কোনও পাটিগণিত নেই, সুতরাং আমাদের পূর্ণসংখ্যার ওভারফ্লো সম্পর্কে চিন্তা করার দরকার নেই। কেবলমাত্র আমরা যা করি তা হ'ল প্রচুর অ্যারে রেফারেন্স। এবং ফলাফলগুলি এখানে রয়েছে — সুইফট -33 -অফেষ্টের সাথে তুলনায় প্রায় 500 ফ্যাক্টর দ্বারা হারায়:
- সি ++ -O3: 0.05 এস
- সি ++ -O0: 0.4 এস
- জাভা: 0.2 এস
- পাইপাই সহ পাইথন: 0.5 এস
- পাইথন: 12 এস
- সুইফ্ট-ওয়েস্ট: 0.05 এস
- সুইফট -O3: 23 এস
- সুইফট -O0: 443 এস
(আপনি যদি উদ্বিগ্ন হন যে সংকলকটি অর্থহীন লুপগুলি সম্পূর্ণরূপে অপ্টিমাইজ করতে পারে তবে আপনি এটিকে উদাহরণ হিসাবে পরিবর্তন করতে পারেন x[i] ^= x[j]
এবং একটি মুদ্রণ বিবৃতি যোগ করতে পারেন যা ফলাফল x[0]
দেয় This
এবং হ্যাঁ, এখানে পাইথন বাস্তবায়ন ছিল একটি নির্বুদ্ধ খাঁটি পাইথন বাস্তবায়ন ts এটি অবিক্রিত সুইফ্টের চেয়ে অনেক ধীর হওয়া উচিত । কিছু মনে হচ্ছে সুইফট এবং অ্যারে সূচক দিয়ে গুরুতরভাবে ভেঙে গেছে।
সম্পাদনা 4: এই সমস্যাগুলি (পাশাপাশি কিছু অন্যান্য পারফরম্যান্সের সমস্যাগুলি) Xcode 6 বিটা 5 এ স্থির করা হয়েছে বলে মনে হচ্ছে।
বাছাইয়ের জন্য, আমার এখন নিম্নলিখিত সময়গুলি রয়েছে:
- ঝনঝন ++ -O3: 0.06 এস
- swiftc -O ব্রেকফাস্ট: 0.1 s
- swiftc -O: 0.1 s
- swiftc: 4 s
নেস্টেড লুপগুলির জন্য:
- ঝনঝন ++ -O3: 0.06 এস
- swiftc -Ofast: 0.3 s
- swiftc -O: 0.4 s
- swiftc: 540 s
দেখে মনে হয় যে অনিরাপদ -Ofast
(ওরফে -Ounchecked
) ব্যবহারের আর কোনও কারণ নেই ; প্লেইন -O
সমানভাবে ভাল কোড উত্পাদন করে।
xcrun --sdk macosx swift -O3
। এটা খাটো।