ম্যাটল্যাব ওওপি ধীরগতিতে বা আমি কিছু ভুল করছি?


144

আমি নিয়ে পরীক্ষা-নিরীক্ষা করছি ম্যাটল্যাব গলি , একটি আমি আমার সি ++ এর লগার শ্রেণীর কিছুতেই নকল শুরু এবং আমি একটি স্ট্রিং ক্লাসে আমার সমস্ত স্ট্রিং সাহায্যকারী ফাংশন নির্বাণ করছি, চিন্তা এটা মত কাজগুলি করার পাবে মহান হতে হবে a + b, a == b, a.find( b )পরিবর্তে strcat( a b ), strcmp( a, b ), strfind( a, b )ইত্যাদির প্রথম উপাদান পুনরুদ্ধার করুন

সমস্যা: মন্থরতা

আমি উপরের জিনিসগুলি ব্যবহার করার জন্য রেখেছিলাম এবং তাত্ক্ষণিকভাবে একটি কঠোর মন্দা লক্ষ্য করেছি । আমি কি এটি ভুল করছি (যা অবশ্যই ম্যাটল্যাবের অভিজ্ঞতা সীমিত করার কারণে সম্ভব) বা ম্যাটল্যাবের ওওপি কি প্রচুর ওভারহেডের পরিচয় দেয়?

আমার পরীক্ষার কেস

স্ট্রিংয়ের জন্য আমি যে সাধারণ পরীক্ষাটি করেছি তা এখানে মূলত একটি স্ট্রিং যুক্ত করা এবং আবার সংযুক্ত অংশটি আবার সরিয়ে ফেলা:

দ্রষ্টব্য: বাস্তব কোডটিতে আসলে এর মতো স্ট্রিং ক্লাস লিখবেন না! মতলব এখন একটি নেটিভ stringঅ্যারে টাইপ আছে, এবং আপনার পরিবর্তে এটি ব্যবহার করা উচিত।

classdef String < handle
  ....
  properties
    stringobj = '';
  end
  function o = plus( o, b )
    o.stringobj = [ o.stringobj b ];
  end
  function n = Length( o )
    n = length( o.stringobj );
  end
  function o = SetLength( o, n )
    o.stringobj = o.stringobj( 1 : n );
  end
end

function atest( a, b ) %plain functions
  n = length( a );
  a = [ a b ];
  a = a( 1 : n );

function btest( a, b ) %OOP
  n = a.Length();
  a = a + b;
  a.SetLength( n );

function RunProfilerLoop( nLoop, fun, varargin )
  profile on;
  for i = 1 : nLoop
    fun( varargin{ : } );
  end
  profile off;
  profile report;

a = 'test';
aString = String( 'test' );
RunProfilerLoop( 1000, @(x,y)atest(x,y), a, 'appendme' );
RunProfilerLoop( 1000, @(x,y)btest(x,y), aString, 'appendme' );

ফলাফলগুলো

সেকেন্ডে মোট সময়, 1000 পুনরাবৃত্তির জন্য:

বেস্ট 0.550 (স্ট্রিং.সেটলেন্থ 0.138, স্ট্রিং.প্লাস 0.065, স্ট্রিং। দৈর্ঘ্য 0.057 সহ)

সেরা 0.015

লগার সিস্টেমের জন্য ফলাফলগুলি একইভাবে: frpintf( 1, 'test\n' )স্ট্রিং ক্লাসটি অভ্যন্তরীণভাবে ব্যবহার করার সময় আমার কম্পিউটারে 1000 কলের জন্য 7 (!) সেকেন্ডের জন্য 0.1 সেকেন্ড , ঠিক আছে, এতে আরও অনেক যুক্তি রয়েছে তবে সি ++ এর সাথে তুলনা করতে: আমার সিস্টেমের ওভারহেড যা ব্যবহার করে std::string( "blah" )এবং std::coutআউটপুট দিকে বনাম প্লেইন std::cout << "blah"1 মিলিসেকেন্ডের ক্রমে থাকে))

ক্লাস / প্যাকেজ ফাংশন সন্ধান করার সময় কি কেবল ওভারহেড হয়?

যেহেতু ম্যাটল্যাব ব্যাখ্যা করা হয়েছে, তাই এটি রান সময় কোনও ফাংশন / অবজেক্টের সংজ্ঞাটি সন্ধান করতে হবে। সুতরাং আমি ভাবছিলাম যে সম্ভবত আরও অনেকগুলি ওভারহেড শ্রেণিতে বা প্যাকেজ ফাংশন বনাম ফাংশন সন্ধানে জড়িত। আমি এটি পরীক্ষা করার চেষ্টা করেছি, এবং এটি কেবল অচেনা হয়ে যায়। শ্রেণি / অবজেক্টের প্রভাব বিলোপ করতে, আমি কোনও প্যাকেজে বনাম কোনও ক্রিয়াকলাপের পথে কোনও ফাংশন কল করার সাথে তুলনা করেছি:

function n = atest( x, y )
  n = ctest( x, y ); % ctest is in matlab path

function n = btest( x, y )
  n = util.ctest( x, y ); % ctest is in +util directory, parent directory is in path

ফলাফল, উপরের মত একইভাবে জড়ো:

সর্বমোট 0.004 সেকেন্ড, টেস্টে 0.001 সেকেন্ড

ব্যাস্টেস্ট 0.060 সেকেন্ড, ইউএস.কেস্টে 0.014 সেকেন্ড

সুতরাং, এই সমস্ত ওভারহেডটি কেবল ম্যাটল্যাব থেকে তার ওওপি বাস্তবায়নের জন্য সংজ্ঞা খোঁজার সময় ব্যয় করে আসছে যখন এই ওভারহেডটি সরাসরি পথে চলছে এমন ফাংশনগুলির জন্য নেই?


5
এই প্রশ্নের জন্য আপনাকে ধন্যবাদ! মতলব হিপের পারফরম্যান্স (ওওপি / ক্লোজারগুলি) বছরের পর বছর ধরে আমাকে সমস্যায় ফেলেছে, স্ট্যাকওভারফ্লো // প্রশ্নগুলি দেখুন / 1446281/ matlabs-garbage-collector । মাতলাবডগ / লরেন / মাইককেটজ আপনার পোস্টটিতে কী প্রতিক্রিয়া জানাবে আমি সত্যিই আগ্রহী।
মিখাইল

1
^ এটি একটি আকর্ষণীয় পড়া ছিল।
stijn

1
@ মতল্যাবডুগ: সম্ভবত আপনার সহকর্মী মাইক করর ওপিতে মন্তব্য করতে পারবেন?
মিখাইল

4
পাঠকদেরও এই সাম্প্রতিক ব্লগ পোস্টটি (ডেভ ফোটির মাধ্যমে) সর্বশেষ আর ২০১২ এ সংস্করণে ওওপি পারফরম্যান্সের বিষয়ে আলোচনা করা উচিত: অবজেক্ট-ওরিয়েন্টেড ম্যাটল্যাব কোডে পারফরম্যান্স বিবেচনা করে
আম্রো

1
কোড কাঠামোর সংবেদনশীলতার একটি সাধারণ উদাহরণ, যাতে লুঠের বাইরে সাবেলিটমেন্টের পদ্ধতিগুলির কল নেওয়া হয়। for i = 1:this.get_n_quantities() if(strcmp(id,this.get_quantity_rlz(i).get_id())) ix = i; end end২.২ সেকেন্ড লাগে, যখন nq = this.get_n_quantities(); a = this.get_quantity_realizations(); for i = 1:nq c = a{i}; if(strcmp(id,c.get_id())) ix = i; end end0.01, ম্যাগের দুটি অর্ডার লাগে
জোসে অস্পিনা

উত্তর:


223

আমি ও ও ম্যাটল্যাবের সাথে কিছুক্ষণ কাজ করছি এবং অনুরূপ পারফরম্যান্স সংক্রান্ত সমস্যাগুলি দেখছি।

সংক্ষিপ্ত উত্তরটি হল: হ্যাঁ, ম্যাটল্যাবের ওওপি এক ধরণের ধীর। মূলধারার ওও ভাষাগুলির চেয়ে বেশি, ওভারহেডের পর্যাপ্ত পদ্ধতি কল রয়েছে এবং এটি সম্পর্কে আপনি করার মতো তেমন কিছুই নেই। কারণটির অংশটি হ'ল আইডিয়োম্যাটিক এমএটিএলবি পদ্ধতি কলগুলির সংখ্যা হ্রাস করতে "ভেক্টরাইজড" কোড ব্যবহার করে এবং প্রতি কল ওভারহেড কোনও উচ্চ অগ্রাধিকার নয়।

আমি না-কিছুই "নাপ" ফাংশন বিভিন্ন ধরণের ফাংশন এবং পদ্ধতি হিসাবে লিখে পারফরম্যান্সকে বেঞ্চমার্ক করেছি 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


5
@ অ্যান্ড্রুজ্যাঙ্ক আপনার কি মনে হয় আপনি আর ২০১২ এ দিয়ে আবার বেঞ্চমার্ক চালাতে পারবেন? এটি সত্যিই আকর্ষণীয়।
ডাং খোয়া

7
হাই বাউল. আপনি যদি এখনও উত্স কোডটিতে আগ্রহী হন তবে আমি এটি পুনর্গঠন করেছি এবং এটি গিটহাবের উপর খোলা উত্সাহিত করেছি। github.com/apjanke/matlab-bench
অ্যান্ড্রু

2
@ সিদা: স্ট্যাটিক পদ্ধতিগুলি এই ফলাফলগুলিতে "ক্লাসেডেফ ক্লাস.স্ট্যাটিক_নোপ ()" হিসাবে তালিকাভুক্ত রয়েছে। ফাংশনের তুলনায় এগুলি বেশ ধীর। যদি তাদের প্রায়শই ডাকা না হয়, তাতে কিছু আসে যায় না।
অ্যান্ড্রু জ্যাঙ্ক

2
এখানে @AndrewJanke এটি হল: gist.github.com/ShakedDovrat/62db9e8f6883c5e28fc0
Shaked

2
কি দারুন! যদি এই ফলাফলগুলি ধরে রাখে তবে আমার এই পুরো উত্তরটি সংশোধন করা দরকার। যোগ করা হয়েছে। ধন্যবাদ!
অ্যান্ড্রু জান্কে

3

সাফ করার উদ্দেশ্যে নিজের কাছে রেফারেন্সগুলির সমস্ত ট্র্যাকিং থেকে হ্যান্ডেল শ্রেণীর একটি অতিরিক্ত ওভারহেড রয়েছে।

হ্যান্ডেল ক্লাসটি ব্যবহার না করে একই পরীক্ষা করে দেখুন এবং দেখুন আপনার ফলাফল কী।


1
স্ট্রিংয়ের সাথে ঠিক একই পরীক্ষা, তবে এখন একটি মান শ্রেণি হিসাবে (যদিও অন্য একটি মেশিনে); সেরা: 0.009, বেস্ট: o.356। এটি হ্যান্ডেলের সাথে মূলত একই পার্থক্য, তাই আমি মনে করি না ট্র্যাকিং রেফারেন্সগুলিই মূল উত্তর। এটি প্যাকেজগুলিতে ফাংশন বনাম ফাংশনে ওভারহেডের ব্যাখ্যা দেয় না।
stijn

আপনি মতলবটির কোন সংস্করণ ব্যবহার করছেন?
মাইকেল

1
আমি হ্যান্ডেল এবং মান শ্রেণীর মধ্যে কিছু অনুরূপ তুলনা চালিয়েছি এবং উভয়ের মধ্যে পারফরম্যান্সের পার্থক্যটি লক্ষ্য করি নি।
RjOllos

আমি আর পার্থক্য লক্ষ্য করি না।
মাইকেল

বোঝায়: মাতলাব-এ, সমস্ত অ্যারে, কেবলমাত্র অবজেক্টগুলি পরিচালনা করে না, রেফারেন্স-গণনা করা হয়, কারণ তারা অনুলিপি অনুলিপি এবং ভাগ করে নেওয়া অন্তর্নিহিত কাঁচা ডেটা ব্যবহার করে।
অ্যান্ড্রু জান্কে

1

ওও পারফরম্যান্স ব্যবহৃত ম্যাটল্যাব সংস্করণে উল্লেখযোগ্যভাবে নির্ভর করে। আমি সমস্ত সংস্করণে মন্তব্য করতে পারি না, তবে অভিজ্ঞতা থেকে জানি যে ২০১২a সংস্করণটি ২০১০ এর তুলনায় অনেক উন্নত। কোনও মানদণ্ড এবং উপস্থাপনের জন্য কোনও সংখ্যা নেই। আমার কোড, একচেটিয়াভাবে হ্যান্ডেল ক্লাস ব্যবহার করে লেখা এবং 2012a এর অধীনে লিখিত আগের সংস্করণগুলির অধীনে চলবে না।


1

আসলে আপনার কোড নিয়ে কোনও সমস্যা নেই তবে এটি মতলব নিয়ে সমস্যা। আমার মনে হয় এটিতে এক ধরণের খেলা দেখতে একদম ভালো লাগে। ক্লাস কোডটি সংকলন করার জন্য ওভারহেড ছাড়া কিছুই নয়। আমি সাধারণ ক্লাস পয়েন্ট (একবার হ্যান্ডেল হিসাবে) এবং অন্যটি (একবার মান মান হিসাবে) দিয়ে পরীক্ষাটি করেছি

    classdef Pointh < handle
    properties
       X
       Y
    end  
    methods        
        function p = Pointh (x,y)
            p.X = x;
            p.Y = y;
        end        
        function  d = dist(p,p1)
            d = (p.X - p1.X)^2 + (p.Y - p1.Y)^2 ;
        end

    end
end

এখানে পরীক্ষা

%handle points 
ph = Pointh(1,2);
ph1 = Pointh(2,3);

%values  points 
p = Pointh(1,2);
p1 = Pointh(2,3);

% vector points
pa1 = [1 2 ];
pa2 = [2 3 ];

%Structur points 
Ps.X = 1;
Ps.Y = 2;
ps1.X = 2;
ps1.Y = 3;

N = 1000000;

tic
for i =1:N
    ph.dist(ph1);
end
t1 = toc

tic
for i =1:N
    p.dist(p1);
end
t2 = toc

tic
for i =1:N
    norm(pa1-pa2)^2;
end
t3 = toc

tic
for i =1:N
    (Ps.X-ps1.X)^2+(Ps.Y-ps1.Y)^2;
end
t4 = toc

ফলাফল টি 1 =

12.0212% হ্যান্ডেল

t2 =

12.0042% মান

t3 =

0.5489  % vector

t4 =

0.0707 % structure 

সুতরাং দক্ষ কার্য সম্পাদনের জন্য OOP ব্যবহারের পরিবর্তে স্ট্রাকচারটি গ্রুপ ভেরিয়েবলগুলির পক্ষে ভাল পছন্দ

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.