আর এ সময় নির্ধারণের কাজগুলি [বন্ধ]


36
  1. আমি কোনও ফাংশন সঞ্চালনের পুনরাবৃত্তি করতে যে সময় লাগে তা পরিমাপ করতে চাই। হয় replicate()এবং ব্যবহার সমতুল্য জন্য-loops? উদাহরণ স্বরূপ:

    system.time(replicate(1000, f()));
    system.time(for(i in 1:1000){f()});
    

    যা পছন্দসই পদ্ধতি।

  2. এর আউটপুটে system.time(), sys+userপ্রোগ্রামটি চালানোর জন্য আসল সিপিইউ সময়টি কি? elapsedপ্রোগ্রামটির সময়ের পারফরম্যান্সের কি একটি ভাল পরিমাপ?


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

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

উত্তর:


19

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

যেহেতু আজকাল বেশিরভাগ সিস্টেমগুলি নিয়মিতভাবে বাধাগ্রস্ত হতে পারে, পরিবর্তনশীলতা পরীক্ষা করার জন্য বেশ কয়েকটি টাইমিং রান করা গুরুত্বপূর্ণ important সেকেন্ডের একটি দীর্ঘ রান করার পরিবর্তে, প্রতিটি সেকেন্ডের সেকেন্ডের রান করুন । এটি একসাথে ডাবল লুপে এটি করতে সহায়তা করে। হ্যান্ডেল করা কেবল তত সহজ নয়, এটি প্রতিটি সময়ের সিরিজে কিছুটা নেতিবাচক সম্পর্কের প্রবর্তন করে, যা বাস্তবে অনুমানগুলিকে উন্নত করে।এম এন / এমএনমিএন/মি

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


25

আপনার দুটি বিষয় সম্পর্কে:

  1. এটি স্টাইলিস্টিক replicate()এটি কার্যকর হিসাবে আমি পছন্দ করি ।
  2. আমি ফোকাস করতে ঝোঁক elapsed, তৃতীয় নম্বর।

আমি প্রায়শই যা করি তা হ'ল

N <- someNumber
mean(replicate( N, system.time( f(...) )[3], trimmed=0.05) )

কল করার 90% এন পুনরাবৃত্তির ছাঁটাইযুক্ত গড় পেতে f()

(একটি থিঙ্কো ধরার জন্য হ্যাডলিকে ধন্যবাদ দিয়ে সম্পাদিত)


2
মানে না mean(replicate(N, system.time(f(...))[3]), trim = 0.05)?
হ্যাডলি

2
যদি চ () কলটি দীর্ঘ হয় তবে তা ঠিক আছে। তবে, যদি চ () কল সংক্ষিপ্ত হয় তবে যে কোনও টাইমিং কল ওভারহেড সম্ভবত ত্রুটি পরিমাপ বাড়িয়ে তুলবে। সিস্টেমের জন্য একক কল (সময়) (চ) এর বহু পুনরাবৃত্তির উপরে কল করার পরে একজন ত্রুটিটিকে বিভক্ত করতে পারে যতক্ষণ না এটি কিছু অনন্য মান (এবং এটি দ্রুত ফিরে আসে)।
জন

@ জন: ধন্যবাদ তবে আপনি যা বলেছিলেন তা আমি পুরোপুরি পাই না। আমি এখনও ভাবছি কোনটি ভাল, সিস্টেমের অভ্যন্তরে বা বাইরের বাইরে f () পুনরাবৃত্তি করছে? সময় ()?
টিম

সিস্টেম.টাইম () কমান্ডের প্রতিটি কলটিতে কিছু পরিবর্তনশীল সময় থাকে যা কিছু পরিমাণ পরিমাপের ত্রুটির কারণ হয়ে থাকে। এটি একটি সামান্য পরিমাণ। তবে যদি চ () খুব সংক্ষিপ্ত কল হয়? তারপরে এই ত্রুটিটি f () কল করতে সময় নেওয়ার সাথে মিশে যেতে পারে। সুতরাং, আপনি যখন একক সিস্টেমে f () 1e5 বার কল করেন time টাইম () কল করার সময় ত্রুটিটি 1e5 খণ্ডে বিভক্ত হয়ে যায়। আপনি যখন প্রতি f () এর জন্য system.Time () কল করেন তখন এফের প্রভাবটি অর্থবহ হতে পারে যদি f () এর জন্য সময় কম থাকে। অবশ্যই, আপনার সমস্ত প্রয়োজন যদি আপেক্ষিক সময়সীমার হয় তবে এটি খুব বেশি গুরুত্বপূর্ণ নয়।
জন

ওহ, এবং দ্বিতীয় অংশটি হ'ল কেবলমাত্র সিস্টেম.ল কল () একবার কল করা আরও দ্রুত হবে।
জন

10

আপনি টাইমস্টেপগুলি দিয়ে ফিরে আসতে পারেন Sys.time; এটি অবশ্যই দেয়ালের সময়কে পরিমাপ করে, তাই আসল সময় গণনার সময়। উদাহরণ কোড:

Sys.time()->start;
replicate(N,doMeasuredComputation());
print(Sys.time()-start);

3

কোন টাইমিং মেট্রিকটি ব্যবহার করবেন তা সম্পর্কে, আমি অন্যান্য উত্তরদাতাদের যুক্ত করতে পারি না।

ব্যবহারের জন্য ফাংশনটি সম্পর্কে, আমি rbenchmark প্যাকেজ থেকে? বেঞ্চমার্কটি ব্যবহার করতে পছন্দ করি ।


1

তারা বিভিন্ন কাজ করে। সময় আপনি কি করতে চান। প্রতিলিপি () ফাংশনের প্রতিটি সম্পাদনের ফলাফলের একটি ভেক্টরকে ফেরত দেয়। লুপ জন্য না। অতএব, তারা সমতুল্য বিবৃতি নয়।

এছাড়াও, আপনি কিছু করতে চান এমন বেশ কয়েকটি উপায়ে সময় দিন। তারপরে আপনি সবচেয়ে কার্যকর পদ্ধতিটি খুঁজে পেতে পারেন।


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