রকু বহুমাত্রিক অ্যারে নিয়ে এত খারাপ অভিনয় করে কেন?


10

আমি কৌতূহল যে কেন রাকু এতটা খারাপ পরিচালনা করে বহুমাত্রিক অ্যারে করে। আমি পাইথন, সি # এবং রাকুতে 2 মাত্রিক ম্যাট্রিক্সের সূচনা করার জন্য একটি দ্রুত পরীক্ষা করেছি এবং অতিবাহিত সময়টি পরেরটির জন্য আশ্চর্যজনকভাবে বেশি।

রাকুর জন্য

my @grid[4000;4000] = [[0 xx 4000] xx 4000];
# Elapsed time 42 seconds !!

পাইথনের জন্য

table= [ [ 0 for i in range(4000) ] for j in range(4000) ]
# Elapsed time 0.51 seconds

সি শার্প

int [,]matrix = new int[4000,4000];
//Just for mimic same behaviour
for(int i=0;i<4000;i++)
   for(int j=0;j<4000;j++)
       matrix[i,j] = 0;
# Elapsed time 0.096 seconds

আমি কি ভুল করছি? এটা অনেক বেশি পার্থক্য বলে মনে হচ্ছে।


5
আকৃতির বহুমাত্রিক অ্যারেগুলির জন্য এটি কেবল ধীর (ইজি এক যেখানে আপনি এটি সংজ্ঞায়িত করেছেন @grid[4000;4000]) পাইথন কোডটি একটি আকৃতির অ্যারে ব্যবহার করে না এবং রাকুতেও একই চেষ্টা করে আপনি আরও অনেক ভাল সময় ফিরে পাবেন: এর my @grid = [[0 xx 4000] xx 4000]; অর্থ হল আপনার সাথে প্রবেশ করতে হবে @grid[0][0]না @grid[0;0]। আমি মনে করি এটি বেশিরভাগ কারণ হ'ল আকারযুক্ত অ্যারেগুলি এখনও কাজ চলছে।
স্কিমন প্রক্টর

1
আমার মেশিনে @grid[1000;1000] = [[0 xx 1000]xx1000]12 সেকেন্ড সময় নিয়েছে। @grid = [[0 xx 1000]xx1000]0.6 নিয়েছে তাই ... হ্যাঁ আমি আকৃতির অ্যারে এড়াতে চাই।
স্কিমন প্রক্টর

5
@ স্কিমন আপনি প্রকৃতপক্ষে আন-শেপড অ্যারেগুলির জন্য [;] অ্যাকসেসরটি ব্যবহার করতে পারেন। my @grid = [[$++ xx 100] xx 100]; say @grid[0;1]; say @grid[1;1]যথাক্রমে 1 এবং 101 প্রদান করে
user0721090601

অসাধারণ! এটি জিনিসগুলিকে সহজ করে তোলে।
স্কিমন প্রক্টর

2
আকৃতির বহু-মাত্রিক অ্যারেগুলি এখনও রাকুডোর অন্যান্য অনেক অঞ্চল যে অপ্টিমাইজেশনের কল্যাণ পায় তা পায় নি।
এলিজাবেথ ম্যাটিজসেন

উত্তর:


13

একটি প্রাথমিক প্রত্যক্ষ তুলনা

আমি এমন কোড দিয়ে শুরু করব যা আপনার পাইথন কোডটির সাথে আপনার নিজের অনুবাদ থেকে অনেক বেশি ঘনিষ্ঠভাবে সংযুক্ত হয়েছে। আমি মনে করি যে রাকু কোডটি আপনার পাইথনের সাথে সরাসরি সমান:

my \table = [ [ 0 for ^4000 ] for ^4000 ];
say table[3999;3999]; # 0

এই কোডটি সিগিল-মুক্ত শনাক্তকারী 1 ঘোষণা করে । এটা তোলে:

  • ড্রপ "শেপিং" ( [4000;4000]ইন my @table[4000;4000])। আমি এটি ফেলে দিয়েছি কারণ আপনার পাইথন কোডটি এটি করছে না। রুপায়ণ সুবিধাগুলি সরবরাহ করে তবে কার্যকারণে জড়িত। 2

  • অ্যাসাইনমেন্টের পরিবর্তে বাইন্ডিং ব্যবহার করে । আমি বাইন্ডিংয়ে স্যুইচ করেছি কারণ আপনার পাইথন কোড অ্যাসাইনমেন্ট নয়, বাঁধাই করছে। (পাইথন দুটির মধ্যে পার্থক্য করে না)) যদিও রাকুর অ্যাসাইনমেন্ট পদ্ধতির মূল কোডগুলি সাধারণ কোডগুলির জন্য মূল্যবান তা এনেছে, তবে এতে পারফরম্যান্সের প্রভাব রয়েছে। 3


এই কোডটি দিয়ে আমি আমার উত্তরটি শুরু করেছি এখনও ধীর।

প্রথমত, রাকু কোড, ডিসেম্বর 2018 থেকে রাকুডো সংকলকের মাধ্যমে চালিত, একই হার্ডওয়্যারে জুন 2019 থেকে পাইথন ইন্টারপ্রেটার ব্যবহার করে আপনার পাইথন কোডের চেয়ে প্রায় 5 গুণ ধীর। 3

দ্বিতীয়ত, রাকু কোড এবং পাইথন কোড উভয়ই ধীর, যেমন আপনার সি # কোডের সাথে তুলনা করে are আমরা আরও ভাল করতে পারি ...

হাজার বছরের গতিবেগের একটি প্রতিমূর্তিযুক্ত বিকল্প

নিম্নলিখিত কোডটি বিবেচনাযোগ্য:

my \table = [ [ 0 xx Inf ] xx Inf ];
say table[ 100_000; 100_000 ]; # 0

আপনার পাইথন এবং সি # কোডের মধ্যে কেবল ১ million মিলিয়ন উপাদানকে তুলনায় দশটি বিলিয়ন উপাদান অ্যারের সাথে সম্পর্কিত এই কোড সত্ত্বেও , এটি চালানোর জন্য প্রাচীরের ঘড়ির সময়টি পাইথন কোডের অর্ধেকের চেয়ে কম এবং সি # এর চেয়ে 5 গুণ কম ধীরে ধীরে রয়েছে running কোড। তার থেকে বোঝা যায় যে রাকুডো রাকু কোড সমান পাইথন কোডের চেয়ে হাজার গুণ দ্রুত এবং সি # কোডের চেয়ে একশগুণ বেশি দ্রুত চালাচ্ছে।

রাকু কোডটি এত দ্রুত গতিতে দেখা যাচ্ছে কারণ টেবিলটি ব্যবহার করে অলসভাবে শুরু করা হচ্ছে xx Inf4say লাইনটি চালানোর ক্ষেত্রে একমাত্র উল্লেখযোগ্য কাজ করা হয় । এটি 100,000 প্রথম মাত্রা অ্যারে তৈরি করে এবং তারপরে 100,000 উপাদানগুলির সাথে মাত্র 100,000 তম দ্বিতীয় মাত্রার অ্যারে তৈরি করে, যাতে সেই অ্যারের শেষ উপাদানটিতে থাকা sayপ্রদর্শন করতে পারে 0

এটি করার একাধিক উপায় রয়েছে

আপনার প্রশ্নের অন্তর্গত একটি বিষয় হ'ল এটি করার জন্য সবসময় একাধিক উপায় থাকে way 5 যদি আপনি কোডের জন্য দুর্বল পারফরম্যান্সের মুখোমুখি হন যেখানে গতি সংকটজনক, এটির মতো আলাদাভাবে কোডিং করা, যেমনটি আমি করেছি, একটি নাটকীয় পার্থক্য করতে পারে। 6

(আর একটি সত্যিই ভাল বিকল্পটি একটি এসও প্রশ্ন জিজ্ঞাসা করা ...)

ভবিষ্যৎ

Raku সাবধানে অত্যন্ত optimiz ডিজাইন করা হয়েছে সক্ষম , অর্থাত্ সক্ষম করার একদিন রান অনেক দ্রুত দেওয়া আসছে বছরের পর বছর ধরে যথেষ্ট কম্পাইলার কাজ , পরিবর্তে, বলে পার্ল 5 বা পাইথন 3 পারেন, তত্ত্ব, কখনও চালানোর জন্য, যদি না তিনি ground- মধ্য দিয়ে যেতে পুনরায় নকশা এবং সম্পর্কিত সংস্থাপক কাজ বছর।

কিছুটা ঠিক মত উপমাটি হ'ল গত 25 বছর ধরে জাভার অভিনয়ের সাথে। জাভা স্ট্যাক যে পরিপক্ক প্রক্রিয়াটি পেরেছে তার প্রায় অর্ধেক পথ রাকুডো / এনকিউপি / মোয়ারভিএম way

পাদটিকা

1 আমি লিখতে পারে my $table := ...। তবে ফর্মের ঘোষণাপত্রগুলি সিগিলের my \foo ...বিবেচনা বাদ দেয় এবং এর =পরিবর্তে :=সিগিল'ড শনাক্তকারীটির সাথে প্রয়োজনীয় ব্যবহারের অনুমতি দেয় । (একটি বোনাস হিসাবে, "সিগিল স্ল্যাশিং" ফলাফল সিগিল মুক্ত শনাক্তকারী, সিগিল ব্যবহার না করে এমন অনেক ভাষায় কোডারদের সাথে পরিচিত যা অবশ্যই পাইথন এবং সি # অন্তর্ভুক্ত করে))

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

3 এটি লেখার সময় টিআইও জুন ২০১৯ থেকে পাইথন ৩. and.৪ ব্যবহার করছে, এবং রকুডো ভি ২০১৮.১২, ডিসেম্বর 2018 থেকে ব্যবহার করছে Rak সর্বশেষ রাকুডো এবং সর্বশেষ পাইথনের মধ্যে ফাঁকটি আশা করুন যখন রাকুডো ধীর গতিতে এই উত্তরটিতে বর্ণিত চেয়ে উল্লেখযোগ্যভাবে সংকীর্ণ হবে। বিশেষত, বর্তমান কাজ অ্যাসাইনমেন্টের পারফরম্যান্সে উল্লেখযোগ্যভাবে উন্নতি করছে।

xxঅলস প্রক্রিয়াকরণে 4 টি ডিফল্ট তবে কিছু শব্দগতি ভাষা শব্দার্থবিজ্ঞান বা বর্তমান সংকলক সীমাবদ্ধতার কারণে আগ্রহী মূল্যায়নকে বাধ্য করে। বছরের পুরানো v2018.12 রকুডোতে, ফর্মটির একটি অভিব্যক্তিটি [ [ foo xx bar ] xx baz ]অলস থাকার জন্য এবং আগ্রহীভাবে মূল্যায়ন করতে বাধ্য হবেন না, উভয়ই bar এবং bazহওয়া আবশ্যক Inf। বিপরীতে, my \table = [0 xx 100_000 for ^100_000]কোন ব্যবহার সঙ্গে অলস হয় Inf। (উত্তরোত্তর কোডটি আসলে Seqপ্রথম মাত্রায় 100,000 গুলি সংরক্ষণ করছে 100,000 এর চেয়ে প্রদর্শন Array- পরিবর্তে say WHAT table[0]প্রদর্শন - তবে বেশিরভাগ কোড পার্থক্য চিহ্নিত করতে সক্ষম হবে না - এখনও প্রদর্শিত হবে will )SeqArraysay table[99_999;99_999]0

5 কিছু লোক মনে করে যে এটি মেনে নেওয়া দুর্বলতা যে এটি দেওয়া একাধিক উপায় এবং প্রদত্ত সমস্যাগুলির সমাধানের কোড রয়েছে accept বাস্তবে এটি কমপক্ষে তিনটি শ্রদ্ধার একটি শক্তি প্রথমত, সাধারণভাবে, কোনও প্রদত্ত অ-তুচ্ছ সমস্যার সমাধান পারফরম্যান্স প্রোফাইলে নাটকীয় পার্থক্য সহ অনেক স্বতন্ত্র অ্যালগরিদমের দ্বারা সমাধান করা যেতে পারে। এই উত্তরে ইতিমধ্যে এক বছরের পুরানো রাকুডোর সাথে উপলব্ধ এমন একটি পদ্ধতির অন্তর্ভুক্ত রয়েছে যা কিছু পরিস্থিতিতে অনুশীলনে পাইথনের চেয়ে হাজার গুণ বেশি দ্রুত হবে। দ্বিতীয়ত, রাকুর মতো একটি ইচ্ছাকৃতভাবে নমনীয় এবং বহু-দৃষ্টান্তের ভাষা কোনও কোডারকে (বা কোডারদের দলকে) একটি সমাধান প্রকাশ করার অনুমতি দেয় যা তারা মার্জিত এবং রক্ষণাবেক্ষণ হিসাবে বিবেচনা করে, বা যা কাজটি সম্পন্ন করে, তার ভিত্তিতে তারা কাজ করেভাবা সবচেয়ে ভাল, ভাষা যা চাপায় তা নয়। তৃতীয়ত, অনুকূলিতকরণকারী সংকলক হিসাবে রাকুদোর অভিনয় বর্তমানে উল্লেখযোগ্য পরিবর্তনশীল able সৌভাগ্যবশত এটি একটি মহান প্রোফাইলার হয়েছে 6 , তাই এক দেখতে পারেন যেখানে একটি বোতলের, এবং মহান নমনীয়তা, তাই এক বিকল্প কোডিং চেষ্টা করতে পারেন এবং এই অতি দ্রুত কোড তৈরি করতে পারে।

6 যখন কর্মক্ষমতা বিষয়, অথবা যদি আপনি কর্মক্ষমতা বিষয় তদন্ত করছি, সঙ্গে পরামর্শ কর্মক্ষমতার উপর Raku ডক পৃষ্ঠা ; এই পৃষ্ঠায় রাকুডো প্রোফাইলার ব্যবহার সহ বিভিন্ন বিকল্প রয়েছে।

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