আর এ ফাংশন সম্পাদনের সময় পরিমাপ করছে


282

কার্য সম্পাদনের সময়টি পরিমাপের আর কি কোনও মানক উপায় আছে?

স্পষ্টতই আমি system.timeমৃত্যুদন্ড কার্যকর করার আগে এবং পরে নিতে পারি এবং তারপরে এর পার্থক্য নিতে পারি তবে আমি জানতে চাই যে এখানে কিছু মানক উপায় বা ফাংশন রয়েছে কিনা (চাকাটি আবিষ্কার করতে চান না)।


মনে আছে মনে হচ্ছে আমি একবার নীচের মতো কিছু ব্যবহার করেছি:

somesysfunction("myfunction(with,arguments)")
> Start time : 2001-01-01 00:00:00  # output of somesysfunction
> "Result" "of" "myfunction"        # output of myfunction
> End time : 2001-01-01 00:00:10    # output of somesysfunction
> Total Execution time : 10 seconds # output of somesysfunction

2
আমার মনে হয় আপনার প্রয়োজনের একটি proc.timeকারণ আপনার মনে ছিল system.time
মারেক

1
বড় ফাংশন জন্য, দুর্দান্ত Rprof। এটি একটি কোড অংশ / ফাংশনে সমস্ত প্রক্রিয়াগুলির একটি প্রোফাইল সরবরাহ করে।
ধনী স্ক্রিভেন

38
গুগলের মাধ্যমে এই প্রশ্নটি সন্ধানকারী নতুন ব্যবহারকারী: require(microbenchmark)এখন (কয়েক বছর আগে) সম্প্রদায়টি সময়ের বিষয়গুলির মানক উপায়। times <- microbenchmark( lm(y~x), glm(y~x), times=1e3); example(microbenchmark)। এটি একবারের চেয়ে একবার পরীক্ষা করার চেয়ে 1000 টির বেশি বনাম চেষ্টা করার একটি পরিসংখ্যানগত তুলনা করে । lmglmsystem.time
isomorphismes

একটি টেবিল দেখতে বা একটি বক্সপ্লট দেখতে ব্যবহার করুন res <- microbenchmark(your code1,your code2)এবং তারপরে ! রেফprint(res)ggplot2::autoplot(res)
ট্র্যাভিস

উত্তর:


253

এটি করার আর একটি সম্ভাব্য উপায় হ'ল সিস.টাইম () ব্যবহার করা:

start.time <- Sys.time()
...Relevent codes...
end.time <- Sys.time()
time.taken <- end.time - start.time
time.taken

উপরের উত্তরদ্বয়ের তুলনায় এটি করার সর্বাধিক মার্জিত উপায় নয়, তবে এটি করার একটি উপায় অবশ্যই।


14
এটি অনেক বেশি মেমরি-দক্ষ, তারপরে system.time (), যা কার্যকরভাবে তার যুক্তিগুলি অনুলিপি করে। আপনি যখন আপনার র্যামের সাথে সবে ফিট করে এমন ডেটা নিয়ে কাজ করছেন তখন এটি গুরুত্বপূর্ণ।
অ্যাডাম রাইজকোভস্কি

2
যারা ব্যবহার করেন তাদের জন্য Sys.time, দয়া করে এটি কিছু সতর্কতার জন্য পড়ুন: সিএস.টাইম () এর সাথে টাইমিং আর কোড
20

1
system.time()আমার জন্য দ্রুত ছিল। আমি মনে করি যে উত্তরটি system.time()গ্রহণ করা উচিত!
গওয়াং-জিন কিম

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

186

অন্তর্নির্মিত ফাংশন system.time()এটি করবে।

এর মতো ব্যবহার করুন: system.time(result <- myfunction(with, arguments))


1
জেনে রাখা গুরুত্বপূর্ণ system.time()এটির একটি যুক্তি রয়েছে gcFirstযা TRUEপূর্বনির্ধারিত। এটি একদিকে পরিমাপকে কিছুটা প্রজননযোগ্য করে তোলে তবে মোট রান সময় (যা অবশ্যই পরিমাপ করা হয় না) একটি উল্লেখযোগ্য ওভারহেড উত্পন্ন করতে পারে।
jakob-r

2
এটি কোন ইউনিটে পরিমাপ করা হয়? উদাহরণস্বরূপ আমি কেবল দৌড়েছি system.time(result <- myfunction(with, arguments))এবং আউটপুট হিসাবে 187.564 পেয়েছি- এটি কি কয়েক সেকেন্ডের মধ্যে বা কী?
zsad512


@ zsad512 আমি নিশ্চিত যে সেগুলি সেকেন্ড
টেপার

58

অ্যান্ড্রি যেমন বলেছিলেন, ঠিকঠাক system.time()কাজ করে। সংক্ষিপ্ত ফাংশনের জন্য আমি replicate()এটিতে পছন্দ করি:

system.time( replicate(10000, myfunction(with,arguments) ) )

28
আপনি মাইক্রোবেঞ্চমার্ক প্যাকেজটি ব্যবহার করা আরও ভাল কারণ এটি সময়কালে প্রতিলিপিটির ওভারহেড অন্তর্ভুক্ত করে না।
হ্যাডলি

37

এক্সিকিউশন সময়টি পরিমাপ করার কিছুটা সহজ উপায় হ'ল rbenchmark প্যাকেজটি ব্যবহার করা । এই প্যাকেজটি (সহজেই) আপনাকে আপনার পরীক্ষার পুনরাবৃত্তি করতে কতবার নির্দিষ্ট করতে দেয় এবং আপেক্ষিক মানদণ্ড হওয়া উচিত।

Stats.stackexchange এ সম্পর্কিত প্রশ্নও দেখুন


6
মাইক্রোবেঞ্চমার্ক আরও ভাল কারণ এটি উচ্চতর নির্ভুলতার সময় কার্যকারিতা ব্যবহার করে।
হ্যাডলি

4
@ হ্যাডলি তবে তুলনামূলক ক্ষেত্রে rbenchmark আরও ব্যবহারকারী-বান্ধব। আমার জন্য মাইক্রোবেঞ্চমার্ক সিস্টেম.টাইম আপগ্রেড করা হয়েছে। rmicrobenchmark আমরা কি :) দরকার
Marek

3
মাইক্রোব্যাঙ্কমার্কের রক্ষণাবেক্ষণকারী বেশ প্রতিক্রিয়াশীল - আমি বাজি ধরেছিলাম যে সে আপনার যা যা প্রয়োজন তা যোগ করবে।
হ্যাডলি

34

microbenchmark একাধিক অভিব্যক্তি এবং ক্রিয়াকলাপের জন্য মাপদণ্ডের জন্য একটি হালকা ওজনের (~ 50 কেবি) প্যাকেজ এবং কম-বেশি একটি স্ট্যান্ডার্ড উপায়:

microbenchmark(myfunction(with,arguments))

উদাহরণ স্বরূপ:

> microbenchmark::microbenchmark(log10(5), log(5)/log(10), times = 10000)
Unit: nanoseconds
           expr min lq    mean median uq   max neval cld
       log10(5)   0  0 25.5738      0  1 10265 10000   a
 log(5)/log(10)   0  0 28.1838      0  1 10265 10000

এখানে উভয় এক্সপ্রেশনকে 10000 বার মূল্যায়ন করা হয়েছিল, যার অর্থ প্রয়োগের সময়টি প্রায় 25-30 এনএস হয়।


32

এছাড়াও আছে proc.time()

আপনি একইভাবে ব্যবহার করতে পারেন Sys.timeতবে এটি আপনাকে অনুরূপ ফলাফল দেয় system.time

ptm <- proc.time()
#your function here
proc.time() - ptm

ব্যবহারের মধ্যে প্রধান পার্থক্য

system.time({ #your function here })

যে proc.time()পদ্ধতি এখনও আপনার ক্রিয়াকলাপ নির্বাহ করেন পরিবর্তে ঠিক সময় পরিমাপ ... এবং উপায় দ্বারা, আমি ব্যবহার করতে চান system.timeসঙ্গে {}ভিতরে তাই আপনি যে জিনিসগুলিতে একটি সেট লাগাতে পারেন ...


25

"টিকটোক" প্যাকেজটি আপনাকে কার্যকর করার সময়টি মাপার খুব সহজ উপায় দেয়। ডকুমেন্টেশনটি এতে রয়েছে: https://cran.fhcrc.org/web/packages/tictoc/tictoc.pdf

install.packages("tictoc")
require(tictoc)
tic()
rnorm(1000,0,1)
toc()

অতিবাহিত সময়কে ভেরিয়েবলে বাঁচাতে আপনি করতে পারেন:

install.packages("tictoc")
require(tictoc)
tic()
rnorm(1000,0,1)
exectime <- toc()
exectime <- exectime$toc - exectime$tic

18

যদিও অন্য সমাধানগুলি একক ফাংশনের জন্য দরকারী তবে আমি নিম্নলিখিত কোডটির আরও প্রস্তাব দিচ্ছি যেখানে আরও সাধারণ এবং কার্যকর:

Rprof(tf <- "log.log", memory.profiling = TRUE)
# the code you want to profile must be in between
Rprof (NULL) ; print(summaryRprof(tf))

2
আমি এখন অবধি আরআরফফ সম্পর্কে জানতাম না এবং এটি সত্যিই দুর্দান্ত! প্লাস এটি বেস আর এর সাথে আসে তাই microbenchmarkবা অতিরিক্ত প্যাকেজের প্রয়োজন হয় না profvis
সাইমন সি

আমি ভাবছি যে আরআরএফওফটিও ভিজ্যুয়ালাইজ করা যায়, উদাহরণস্বরূপ যদি আমরা প্রতিটি আইটেমের জন্য এটির প্রোফাইলের জন্য সময় প্লট করতে চাই?
জাভির আমিন

@ জাওরআমিন একটি উপায় আছে, কেবল রাস্তুদিও >> প্রোফাইল মেনু ব্যবহার করুন
টিপিআরো

13

এটি করার আরেকটি সহজ তবে খুব শক্তিশালী উপায় হ'ল প্যাকেজটি ব্যবহার করে profvis। এটি কেবল আপনার কোডের প্রয়োগের সময় পরিমাপ করে না তবে আপনি কার্যকর প্রতিটি ক্রিয়াকলাপের জন্য আপনাকে একটি ড্রিল দেয়। এটি চকচকে জন্যও ব্যবহার করা যেতে পারে।

library(profvis)

profvis({
  #your code here
})

কিছু উদাহরণের জন্য এখানে ক্লিক করুন


11

আপনি যদি পছন্দ করেন তবে আপনি ম্যাটল্যাব-স্টাইল tic- tocফাংশনগুলি ব্যবহার করতে পারেন । এই অন্যান্য এসও প্রশ্ন দেখুন

আর স্টপওয়াচ ফাংশন


যোগ করতে চলেছিল proc.time()... আমি সুন্দর নামটি আরও ভাল পছন্দ করি। =)
26:53
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.