আমি ও ও ম্যাটল্যাবের সাথে কিছুক্ষণ কাজ করছি এবং অনুরূপ পারফরম্যান্স সংক্রান্ত সমস্যাগুলি দেখছি।
সংক্ষিপ্ত উত্তরটি হল: হ্যাঁ, ম্যাটল্যাবের ওওপি এক ধরণের ধীর। মূলধারার ওও ভাষাগুলির চেয়ে বেশি, ওভারহেডের পর্যাপ্ত পদ্ধতি কল রয়েছে এবং এটি সম্পর্কে আপনি করার মতো তেমন কিছুই নেই। কারণটির অংশটি হ'ল আইডিয়োম্যাটিক এমএটিএলবি পদ্ধতি কলগুলির সংখ্যা হ্রাস করতে "ভেক্টরাইজড" কোড ব্যবহার করে এবং প্রতি কল ওভারহেড কোনও উচ্চ অগ্রাধিকার নয়।
আমি না-কিছুই "নাপ" ফাংশন বিভিন্ন ধরণের ফাংশন এবং পদ্ধতি হিসাবে লিখে পারফরম্যান্সকে বেঞ্চমার্ক করেছি ked এখানে কিছু সাধারণ ফলাফল রয়েছে।
>> কল_নাপস
কম্পিউটার: পিসিউইউআইএন প্রকাশ: ২০০৯ বি
প্রতিটি ফাংশন / পদ্ধতিতে 100000 বার কল করা হচ্ছে
ন্যাপ () ফাংশন: 0.02261 সেকেন্ড 0.23 কল প্রতি কল c
nop1-5 () ফাংশন: কল প্রতি 0.02182 সেকেন্ড 0.22 ইউএসি
nop () subfunction: 0.02244 সেকেন্ড 0.22 কল প্রতি কল
@ () [] বেনামে ফাংশন: কল প্রতি 0.08461 সেকেন্ড 0.85 ইউএক c
ন্যাপ (আপত্তি) পদ্ধতি: প্রতি কল প্রতি 0.24664 সেকেন্ড 2.47 ইউএসসি
nop1-5 (Obj) পদ্ধতি: কল প্রতি 0.23469 সেকেন্ড 2.35 ইউএসি
nop () ব্যক্তিগত ফাংশন: কল প্রতি 0.02197 সেকেন্ড 0.22 ইউএসি
ক্লাসডিফ ন্যাপ (আপত্তি): কল প্রতি 0.90547 সেকেন্ড 9.05 ইউএসি
classdef obj.nop (): 1.775522 সেকেন্ড 17.55 কল প্রতি কল
ক্লাসডিফ প্রাইভেট_নোপ (আপত্তি): কল প্রতি 0.84738 সেকেন্ড 8.47 ইউএসসি
ক্লাসডিফ ন্যাপ (আপত্তি) (এম-ফাইল): কল প্রতি 0.90560 সেকেন্ড 9.06 ইউএসসি
Classdef class.staticnop (): 1.16361 সেকেন্ড 11.64 কল প্রতি কল
জাভা ন্যাপ (): কলটিতে প্রতি 2.43035 সেকেন্ড 24.30 ইউএসসি
জাভা স্ট্যাটিক_নপ (): প্রতি কল প্রতি 0.87682 সেকেন্ড 8.77 ইউ
জাভা থেকে জাভা ন্যাপ () প্রতি কলটিতে 0.00014 সেকেন্ড 0.00 ইউএসি
মেক্স মেক্সনপ (): প্রতি কল প্রতি 0.11409 সেকেন্ড 1.14 ইউএক
সি ন্যাপ (): প্রতি কল প্রতি 0.00001 সেকেন্ড 0.00 ইউএসসি
R2008a এর মাধ্যমে R2008a এ একই ফলাফল। এটি উইন্ডোজ এক্সপি x64 এ 32-বিট এমএটিএলবি চলমান।
"জাভা নপ ()" একটি এম-কোড লুপের মধ্যে থেকে ডেকে নেওয়া জাভা পদ্ধতি এবং এতে প্রতিটি কলের সাথে এমএটিএলবি-টু-জাভা প্রেরণা ওভারহেড অন্তর্ভুক্ত রয়েছে। "জাভা থেকে জাভা ন্যাপ () জাভাতে একই জিনিস বলা হয় () লুপের জন্য এবং সেই সীমানা জরিমানা বহন করে না। জাভা এবং সি সময় নুনের দানা দিয়ে নিন; একটি চতুর সংকলক কলগুলি সম্পূর্ণরূপে অপ্টিমাইজ করতে পারে।
প্যাকেজ স্কোপিং মেকানিজমটি নতুন, ক্লাসদেফ ক্লাসগুলির একই সময়ে চালু হয়েছিল। এর আচরণ সম্পর্কিত হতে পারে।
কয়েকটি অস্থায়ী সিদ্ধান্ত:
- পদ্ধতিগুলি কার্যকারিতার চেয়ে ধীর।
- নতুন স্টাইল (ক্লাসেডিফ) পদ্ধতিগুলি পুরানো শৈলীর পদ্ধতির চেয়ে ধীর।
- নতুন
obj.nop()
বাক্য nop(obj)
গঠনটি সিনট্যাক্সের চেয়ে ধীরে ধীরে ধীরে ধীরে এমনকি ক্লাসডেফ অবজেক্টে একই পদ্ধতির জন্যও। জাভা অবজেক্টের জন্য একই (দেখানো হয়নি)। আপনি যদি দ্রুত যেতে চান, কল করুন nop(obj)
।
- উইন্ডোজে 64৪-বিট এমএটিএলবি-তে মেথড কল ওভারহেড উচ্চতর (প্রায় 2x)। (না দেখানো.)
- ম্যাটল্যাব পদ্ধতি প্রেরণটি অন্য কয়েকটি ভাষার চেয়ে ধীর।
এটি কেন এমনটি বলছে তা কেবল আমার পক্ষ থেকে জল্পনা ছিল। ম্যাটল্যাব ইঞ্জিনের ওও ইন্টার্নালগুলি সর্বজনীন নয়। এটি প্রতি সেপ্টেম্বরের তুলনায় সংকলিত সমস্যা নয় - ম্যাটল্যাবের একটি জেআইটি রয়েছে - তবে ম্যাটল্যাবের লুজার টাইপিং এবং সিনট্যাক্সের অর্থ রান সময়ে বেশি কাজ হতে পারে। (উদাহরণস্বরূপ, আপনি সিনট্যাক্স থেকে একাই বলতে পারবেন না যে "f (x)" কোনও ফাংশন কল বা অ্যারেটিতে সূচক; এটি রান সময়ে ওয়ার্কস্পেসের অবস্থার উপর নির্ভর করে)) এটি ম্যাটল্যাবের শ্রেণিবদ্ধ সংজ্ঞাগুলি আবদ্ধ থাকার কারণে হতে পারে ফাইল সিস্টেমের স্থিতিতে এমনভাবে চালিত করুন যাতে অন্যান্য অনেক ভাষা 'নয়।
তো এখন কি করা?
এটির জন্য একটি মূখ্যাত্মক ম্যাটল্যাব পদ্ধতিটি আপনার শ্রেণীর সংজ্ঞাগুলি এমনভাবে তৈরি করে আপনার কোডটিকে "ভেক্টরাইজ" করা যা কোনও অবজেক্ট উদাহরণটি একটি অ্যারে আবৃত করে; এটি হল এর প্রতিটি ক্ষেত্র সমান্তরাল অ্যারে ধারণ করে (যা ম্যাটল্যাব ডকুমেন্টেশনে "প্ল্যানার" সংস্থা নামে পরিচিত)। প্রতিটি বস্তুর অ্যারে থাকার পরিবর্তে প্রতিটি ক্ষেত্র স্কেলারের মান ধারণ করে, বস্তুগুলি যেগুলি নিজে অ্যারে হয় তা সংজ্ঞায়িত করে এবং পদ্ধতিগুলি অ্যারেগুলিকে ইনপুট হিসাবে গ্রহণ করে এবং ক্ষেত্র এবং ইনপুটগুলিতে ভেক্টরাইজড কল করে। এটি করা পদ্ধতি কলগুলির সংখ্যা হ্রাস করে, আশা করি যথেষ্ট পরিমাণে প্রেরণ ওভারহেড কোনও বাধা নয়।
ম্যাটল্যাবে একটি সি ++ বা জাভা ক্লাসের নকল করা সম্ভবত অনুকূল হবে না। জাভা / সি ++ ক্লাসগুলি সাধারণত এমনভাবে তৈরি করা হয় যে অবজেক্টগুলি সর্বনিম্ন বিল্ডিং ব্লক, আপনি যেমন নির্দিষ্ট করতে পারেন (এটি বিভিন্ন শ্রেণীর প্রচুর) সুনির্দিষ্ট, এবং আপনি সেগুলি অ্যারে, সংগ্রহের সামগ্রী ইত্যাদিতে রচনা করেন এবং লুপগুলি দিয়ে তাদের উপর পুনরাবৃত্তি করেন। দ্রুত ম্যাটল্যাব ক্লাস তৈরি করতে, সেই পদ্ধতির অভ্যন্তরে ঘুরিয়ে দিন। যার ক্ষেত্রগুলি অ্যারে রয়েছে এমন বৃহত্তর ক্লাস করুন এবং সেই অ্যারেগুলিতে ভেক্টরাইজড পদ্ধতিগুলি কল করুন।
মূল বক্তব্যটি হ'ল আপনার কোডটি ভাষার শক্তিতে খেলতে - অ্যারে হ্যান্ডলিং, ভেক্টরাইজড গণিত - এবং দুর্বল দাগগুলি এড়ানোর জন্য arrange
সম্পাদনা: মূল পোস্ট থেকে, R2010b এবং R2011a প্রকাশিত হয়েছে। সামগ্রিক চিত্রটি হ'ল এমসিওএস কলগুলি কিছুটা দ্রুত গতিতে এসেছে এবং জাভা এবং পুরানো শৈলীর পদ্ধতিতে কলগুলি ধীর হয়ে উঠছে ।
সম্পাদনা: ফাংশন কল টাইমিংয়ের একটি অতিরিক্ত টেবিল সহ আমার এখানে "সংবেদনশীলতা" -এ কিছু নোট ছিল, যেখানে মতলব পাথটি কীভাবে কনফিগার করা হয়েছিল তার দ্বারা ফাংশন সময়গুলি প্রভাবিত হয়েছিল, তবে এটি আমার নির্দিষ্ট নেটওয়ার্ক সেটআপটির বিপর্যয় বলে মনে হয় সময়. উপরের চার্টটি সময়ের সাথে আমার পরীক্ষাগুলির অগ্রগতির সাধারণ সময়ের প্রতিফলন করে।
আপডেট: আর ২০১১ বি
সম্পাদনা (২/১/201/২০১২): আর ২০১১ বি চলে গেছে এবং এটি আপডেট করার জন্য পারফরম্যান্সের চিত্র যথেষ্ট পরিবর্তন হয়েছে has
আর্ট: পিসিইউইএন প্রকাশ: 2011 বি
মেশিন: আর ২০১১ বি, উইন্ডোজ এক্সপি, ৮ এক্স কোর আই -2-২6০০ @ ৩.৪০ গিগাহার্টজ, ৩ জিবি র্যাম, এনভিআইডিএ এনভিএস 300
প্রতিটি অপারেশন 100000 বার করা
কল প্রতি শৈলী মোট µsec
nop () ফাংশন: 0.01578 0.16
nop (), 10x লুপ আনারোল করুন: 0.01477 0.15
nop (), 100x লুপ আনারোল করুন: 0.01518 0.15
nop () subfunction: 0.01559 0.16
@ () [] বেনামে ফাংশন: 0.06400 0.64
নোপ (আপত্তি) পদ্ধতি: 0.28482 2.85
nop () ব্যক্তিগত ফাংশন: 0.01505 0.15
ক্লাসডিফ ন্যাপ (আপত্তি): 0.43323 4.33
শ্রেণিদেফ obj.nop (): 0.81087 8.11
ক্লাসডিফ প্রাইভেট_নোপ (আপত্তি): 0.32272 3.23
শ্রেণিদেফ শ্রেণি.স্ট্যাটিকনোপ (): 0.88959 8.90
ক্লাসদেফ ধ্রুবক: 1.51890 15.19
শ্রেণিবদ্ধ সম্পত্তি: 0.12992 1.30
গেটারের সাথে শ্রেণিবদ্ধ সম্পত্তি: 1.39912 13.99
+ pkg.nop () ফাংশন: 0.87345 8.73
+ pkg.nop () ভিতরে থেকে + পিকেজি: 0.80501 8.05
জাভা obj.nop (): 1.86378 18.64
জাভা ন্যাপ (আপত্তি): 0.22645 2.26
জাভা ফেভাল ('না', আপত্তি): 0.52544 5.25
জাভা ক্লাস.স্ট্যাটিক_নোপ (): 0.35357 3.54
জাভা ob.nop () জাভা থেকে: 0.00010 0.00
মেক্স মেক্সনপ (): 0.08709 0.87
সি নপ (): 0.00001 0.00
j () (বিল্টিন): 0.00251 0.03
আমি মনে করি এটির ফলস্বরূপ:
- এমসিওএস / শ্রেণিবদ্ধ পদ্ধতিগুলি দ্রুত। পুরানো স্টাইলের ক্লাসগুলির সাথে এখন ব্যয় সমান হবে, যতক্ষণ আপনি
foo(obj)
সিনট্যাক্স ব্যবহার করেন । সুতরাং পদ্ধতির গতি আর বেশিরভাগ ক্ষেত্রে পুরানো স্টাইলের ক্লাসগুলির সাথে আটকে থাকার কারণ নয়। (কুডোস, ম্যাথ ওয়ার্কস!)
- নেমস্পেসে ফাংশন স্থাপন তাদের ধীর করে তোলে। (আর ২০১২ বি তে নতুন নয়, আমার পরীক্ষায় কেবল নতুন)
আপডেট: আর ২০১৪ এ
আমি বেঞ্চমার্কিং কোডটি পুনর্গঠন করেছি এবং এটি আর ২০১৪ এ চালিয়েছি।
PCWIN64 এ মাতলাব আর ২০১৪ এ
ম্যাট্ল্যাব 8.3.0.532 (আর ২০১৪ এ) / জাভা ১.7.০.১১ পিসিউইউআইএন 64 উইন্ডোজ 7 6.1 (ইলোনওয়াই-উইন 7) এ
মেশিন: কোর i7-3615QM সিপিইউ @ 2.30GHz, 4 জিবি র্যাম (ভিএমওয়্যার ভার্চুয়াল প্ল্যাটফর্ম)
nIters = 100000
অপারেশন সময় (µsec)
nop () ফাংশন: 0.14
nop () subfunction: 0.14
@ () [] বেনামে ফাংশন: 0.69
nop (obj) পদ্ধতি: 3.28
@ ক্লাসে nop () প্রাইভেট fcn: 0.14
Classdef nop (obj): 5.30
classdef obj.nop (): 10.78
শ্রেণিবদ্ধ pivate_nop (আপত্তি): 4.88
ক্লাসডিফ ক্লাস.স্ট্যাটিক_নোপ (): 11.81
ক্লাসদেফ ধ্রুবক: 4.18
শ্রেণিবদ্ধ সম্পত্তি: 1.18
গেটারের সাথে শ্রেণিবদ্ধ সম্পত্তি: 19.26
+ pkg.nop () ফাংশন: 4.03
+ pkg.nop () ভিতরে থেকে + pkg: 4.16
ফ্যাভাল ('না'): 2.31
ফ্যাভাল (@ নোট): 0.22
eval ('না'): 59.46
জাভা obj.nop (): 26.07
জাভা ন্যাপ (আপত্তি): 3.72
জাভা ফেভাল ('না', আপত্তি): 9.25
জাভা ক্লাস.স্ট্যাটিক নপ (): 10.54
জাভা ob.nop () জাভা থেকে: 0.01
মেক্স মেক্সনপ (): 0.91
বিল্টিন জ (): 0.02
কাঠামো s.foo ক্ষেত্র অ্যাক্সেস: 0.14
isempty (অবিচলিত): 0.00
আপডেট: আর ২০১৫ বি: অবজেক্টস দ্রুত পেল!
এখানে R2015b ফলাফলগুলি দয়া করে @ শ্যাকড দ্বারা সরবরাহ করা হয়েছে। এটি একটি বড় পরিবর্তন: ওওপি উল্লেখযোগ্যভাবে দ্রুত এবং এখন obj.method()
সিনট্যাক্সটি method(obj)
লিগ্যাসি ওওপি অবজেক্টের চেয়ে অনেক দ্রুত এবং তত দ্রুত।
PCWIN64 এ মাতলাব আর ২০১৫ বি
মতলব 8.6.0.267246 (আর ২০১৫ বি) / জাভা ১.7.০_60 PCWIN64 উইন্ডোজ 8 6.2 (ন্যানিট-শেভড)
মেশিন: কোর i7-4720HQ সিপিইউ @ 2.60GHz, 16 জিবি র্যাম (20378)
nIters = 100000
অপারেশন সময় (µsec)
nop () ফাংশন: 0.04
nop () subfunction: 0.08
@ () [] বেনামে ফাংশন: 1.83
nop (obj) পদ্ধতি: 3.15
nop () প্রাইভেট fcn @ ক্লাসে: 0.04
Classdef nop (obj): 0.28
classdef obj.nop (): 0.31
ক্লাসডিফ পাইভেট_নোপ (আপত্তি): 0.34
classdef class.static_nop (): 0.05
ক্লাসদেফ ধ্রুবক: 0.25
শ্রেণিবদ্ধ সম্পত্তি: 0.25
গেটর সহ শ্রেণিদেফ সম্পত্তি: 0.64
+ pkg.nop () ফাংশন: 0.04
+ pkg.nop () ভিতরে থেকে + পিকেজি: 0.04
ফ্যাভাল ('না'): 8.26
ফ্যাভাল (@ নোট): 0.63
eval ('না'): 21.22
জাভা ob.nop (): 14.15
জাভা ন্যাপ (আপত্তি): 2.50
জাভা ফেভাল ('না', আপত্তি): 10.30
জাভা ক্লাস.স্ট্যাটিক নপ (): 24.48
জাভা ob.nop () জাভা থেকে: 0.01
মেক্স মেক্সনপ (): 0.33
বিল্টিন জ (): 0.15
s s.foo ক্ষেত্রের অ্যাক্সেস: 0.25
isempty (অবিচলিত): 0.13
আপডেট: আর ২০১৮ এ
এখানে R2018a ফলাফল রয়েছে। আর2015 বি-তে নতুন এক্সিকিউশন ইঞ্জিন চালু হওয়ার সময় আমরা এটি দেখতে পেলাম না, তবে বছরের উন্নতিতে এটি এখনও একটি প্রশংসনীয় বছর। উল্লেখযোগ্যভাবে, বেনামে ফাংশন হ্যান্ডলগুলি দ্রুত পেল।
MACI64 এ মতলব আর ২০১৮ এ
ম্যাটল্যাব 9.4.0.813654 (আর ২০১৮ এ) / জাভা ১.৮.০.৪৪৩ এ MACI64 ম্যাক ওএস এক্স 10.13.5 (ইলোনউই)
মেশিন: কোর i7-3615QM সিপিইউ @ 2.30GHz, 16 জিবি র্যাম
nIters = 100000
অপারেশন সময় (µsec)
nop () ফাংশন: 0.03
nop () subfunction: 0.04
@ () [] বেনামে ফাংশন: 0.16
Classdef nop (obj): 0.16
classdef obj.nop (): 0.17
শ্রেণিবদ্ধ pivate_nop (আপত্তি): 0.16
ক্লাসডিফ ক্লাস.স্ট্যাটিক_নপ (): 0.03
ক্লাসদেফ ধ্রুবক: 0.16
শ্রেণিবদ্ধ সম্পত্তি: 0.13
গেটর সহ শ্রেণিবদ্ধ সম্পত্তি: 0.39
+ pkg.nop () ফাংশন: 0.02
+ pkg.nop () ভিতরে থেকে + পিকেজি: 0.02
ফ্যাভাল ('না'): 15.62
ফ্যাভাল (@ নোট): 0.43
eval ('না'): 32.08
জাভা obj.nop (): 28.77
জাভা ন্যাপ (আপত্তি): 8.02
জাভা ফ্যাভাল ('না', আপত্তি): 21.85
জাভা ক্লাস.স্ট্যাটিক নপ (): 45.49
জাভা ob.nop () জাভা থেকে: 0.03
মেক্স মেক্সনপ (): 3.54
বিল্টিন জে (): 0.10
কাঠামো s.foo ক্ষেত্র অ্যাক্সেস: 0.16
isempty (অবিরাম): 0.07
আপডেট: R2018b এবং R2019a: কোনও পরিবর্তন নেই
কোনও উল্লেখযোগ্য পরিবর্তন নেই। আমি পরীক্ষার ফলাফল অন্তর্ভুক্ত করতে বিরক্ত করছি না।
বেঞ্চমার্কের জন্য সোর্স কোড
আমি এই বেঞ্চমার্কগুলির উত্স কোডটি এমআইটি লাইসেন্সের অধীনে প্রকাশিত গিটহাবের উপরে রেখেছি। https://github.com/apjanke/matlab-bench