শেলের মধ্যে প্রোগ্রাম কার্যকর করার সময় পান


407

আমি একটি লিনাক্স শেলের মধ্যে কয়েকটি ভিন্ন শর্তে কিছু সম্পাদন করতে চাই এবং প্রতিটি সম্পাদনের সময় নির্বাহের সময় আউটপুট করতে সক্ষম হতে চাই be

আমি জানি আমি পার্ল বা পাইথন স্ক্রিপ্ট লিখতে পারি যা এটি করতে পারে তবে শেলের মধ্যে আমি কীভাবে এটি করতে পারি? (যা বাশ হতে পারে)


2
উইন্ডোজ মামলা: stackoverflow.com/questions/673523/...
n611x007

Ticksউইন্ডোজ কেসের মতো পাওয়া কি সম্ভব ?
ফ্রিফরাল টিউজ

উত্তর:


534

অন্তর্নির্মিত timeকীওয়ার্ডটি ব্যবহার করুন :

$ সাহায্যের সময়

সময়: সময় [-পি] পাইপলাইন
    পাইপলাইন কার্যকর করুন এবং রিয়েল টাইম, ব্যবহারকারী সিপিইউ সময়, এর সংক্ষিপ্তসার মুদ্রণ করুন,
    এবং সিস্টেমের সিপিইউ সময়টি পিআইপিএলাইন নির্বাহের সময় কার্যকর করতে ব্যয় করেছিল।
    রিটার্নের স্থিতি হ'ল পাইপলাইনের রিটার্নের স্ট্যাটাস। `-P 'বিকল্প
    কিছুটা ভিন্ন বিন্যাসে সময় সংক্ষিপ্তসার মুদ্রণ করে। এটি ব্যবহার করে
    আউটপুট ফর্ম্যাট হিসাবে TIMEFORMAT ভেরিয়েবলের মান।

উদাহরণ:

$ time sleep 2
আসল 0 মি 2.009 সে
ব্যবহারকারী 0m0.000s
ss 0m0.004s

1
এটি কমান্ডের মতো কীভাবে ব্যবহার হয় time -p i=x; while read line; do x=x; done < /path/to/file.txt? এটি তাত্ক্ষণিকভাবে 0.00 ফেরত দেয় যদি না আমি লুপটির আগে কিছু না রাখি .. কী দেয়?
নাটলি

এটি দরিদ্র 'সময়' সংস্করণ, বাশ বিল্টিন। বাহ্যিক 'সময়' কমান্ড কোথায়?
Znik

6
@ জনিক, চেষ্টা করুন / ইউএসআর / বিন / সময়
মার্ক রাজকক

10
@ নাটলি: timeএকটি পুরো পাইপলাইন যেমন রয়েছে তেমন সময় কাটাতে (বাশ কীওয়ার্ড হওয়ার কারণে ) আপনাকে একটি গ্রুপ কমান্ড ব্যবহার করতে হবে ( { ...; ...; }) সময়ে একাধিক কমান্ড:time -p { i=x; while read line; do x=x; done < /path/to/file.txt; }
mklement0

2
আপনি আপনার সিস্টেমে ইনস্টল হওয়া সময়ের সমস্ত সংস্করণ দেখতে, আপনি ব্যবহার করতে পারেনtype -a time
স্পিনআপ

120

সময় (1)time ব্যবহার করে অন্তর্নির্মিত বাশ (যা রবার্ট গাম্বল উল্লেখ করেছেন) এর চেয়ে আপনি অনেক বেশি বিস্তারিত তথ্য পেতে পারেন । সাধারণত এটি হয় ।/usr/bin/time

সম্পাদকের দ্রষ্টব্য: আপনি আপনার শেলের কীওয়ার্ডের পরিবর্তে বাহ্যিক ইউটিলিটিটি চালু করছেন তা নিশ্চিত করার জন্য , এটি হিসাবে অনুরোধ করুন । একটি পসিক্স-ম্যান্ডেন্ডেট ইউটিলিটি , তবে এটি সমর্থন করার জন্য কেবলমাত্র বিকল্পটি হ'ল । : নির্দিষ্ট প্ল্যাটফর্মের নির্দিষ্ট, নন-স্ট্যান্ডার্ড এক্সটেনশন বাস্তবায়ন সাথে কাজে গনুহ এর নীচে (প্রশ্ন ছাগু ট্যাগ করা হয় প্রদর্শিত, ইউটিলিটিtimetime /usr/bin/time
time-p
-vtime); BSD / macOS বাস্তবায়ন -lএকই ধরণের আউটপুট উত্পাদন করতে ব্যবহার করে - দেখুন man 1 time

ভার্বোজ আউটপুট উদাহরণ:


$ /usr/bin/time -v sleep 1
       Command being timed: "sleep 1"
       User time (seconds): 0.00
       System time (seconds): 0.00
       Percent of CPU this job got: 1%
       Elapsed (wall clock) time (h:mm:ss or m:ss): 0:01.05
       Average shared text size (kbytes): 0
       Average unshared data size (kbytes): 0
       Average stack size (kbytes): 0
       Average total size (kbytes): 0
       Maximum resident set size (kbytes): 0
       Average resident set size (kbytes): 0
       Major (requiring I/O) page faults: 0
       Minor (reclaiming a frame) page faults: 210
       Voluntary context switches: 2
       Involuntary context switches: 1
       Swaps: 0
       File system inputs: 0
       File system outputs: 0
       Socket messages sent: 0
       Socket messages received: 0
       Signals delivered: 0
       Page size (bytes): 4096
       Exit status: 0


2
আপনি কি ডিবিয়ান প্যাকেজ থেকে আসতে হবে তা জানতে হবে না? ডিফল্ট হিসাবে ইনস্টল করা হয়েছে বলে মনে হচ্ছে না
Decu

1
আমি আপনার পোস্ট রবার্ট উল্লেখ করছি। আপনার নির্দেশিত আদেশটি বোঝানো না হলে বাশ কি অন্তর্নির্মিত নয়?
শে

24
আশ্চর্যজনকভাবে যথেষ্ট, এটি "সময়" নামক একটি প্যাকেজ থেকে ইনস্টল করা হয়েছে।
পল টমবলিন

2
/ Usr / বিন / সময় থেকে আউটপুট "0.00user 0.00 সিস্টেম 0: 02.00 বিস্তৃত 0% সিপিইউ (0avgtext + 0avgdata 0maxresident) কে 0 ইনপুট + 0 আউটপুট (0 মজোর + 172 মিনার) পৃষ্ঠাফল্ট 0 অপটপ"
পল

4
@ নিক: "সুডো ইনস্টল সময়টি প্রস্তুত করুন"।
রবার্ট গ্যাম্বল

79
#!/bin/bash
START=$(date +%s)
# do something
# start your script work here
ls -R /etc > /tmp/x
rm -f /tmp/x
# your logic ends here
END=$(date +%s)
DIFF=$(( $END - $START ))
echo "It took $DIFF seconds"

14
অনেক সহজ উপায় আছে। বাশ গণনা স্বয়ংক্রিয়ভাবে বিশেষ ভেরিয়েবল $ SECONDS, তারপরে বহিরাগত তারিখ কমান্ডের উপর ভিত্তি করে পুনঃ গণনা অপরিবর্তিত। CO সেকেন্ডস ভেরিয়েবলটি শুরু হওয়ার সাথে সাথে সেকেন্ডে সেকেন্ডে বাশ স্ক্রিপ্ট চলমান রাখে। এই ভেরিয়েবলের কিছু বিশেষ সম্পত্তি রয়েছে। ম্যান পৃষ্ঠাটি দেখুন: ডি
জ্নিক

আমি মন্তব্যে উপরোক্ত এবং পদ্ধতি উভয়ই চেষ্টা করেছি। 1 ম এ আমি একটি 'অবৈধ ভেরিয়েবল' ত্রুটি পেয়েছি এবং ২ য় বার আমি 'অজানা ভেরিয়েবল'
পেয়েছি

45

লাইন বাই লাইন ডেল্টা পরিমাপের জন্য, জ্ঞোমন চেষ্টা করুন ।

অন্য কমান্ডের স্ট্যান্ডার্ড আউটপুটে টাইমস্ট্যাম্প তথ্য প্রিপেন্ড করতে একটি কমান্ড লাইন ইউটিলিটি, মুর্টিলের টিএস এর মতো কিছুটা। দীর্ঘ-চলমান প্রক্রিয়াগুলির জন্য দরকারী যেখানে আপনি এত দীর্ঘ সময় নিয়ে যাচ্ছেন তার একটি recordতিহাসিক রেকর্ড চাই।

আপনি সেকেন্ডের মধ্যে একটি দৈর্ঘ্যের প্রান্তিক নির্দিষ্টকরণের জন্য --highএবং / অথবা --mediumবিকল্পগুলি ব্যবহার করতে পারেন , যার উপর দিয়ে জ্ঞোমন লাল বা হলুদ রঙের টাইমস্ট্যাম্পটি হাইলাইট করবে। এবং আপনি আরও কয়েকটি কাজ করতে পারেন।

উদাহরণ


3
দুর্দান্ত টিপ, তবে কেবল স্পষ্ট করে বলা: এটি লাইন বাই লাইন সময়ের জন্য দরকারী তবে এ জাতীয় সূক্ষ্ম সময় নেওয়ার ওভারহেড সামগ্রিক সময়কে উল্লেখযোগ্যভাবে যুক্ত করে ।
mklement0

2
দুর্দান্ত উপযোগিতা .. ভাগ করে নেওয়ার জন্য ধন্যবাদ
কিশান বি

19

আপনি আরও নির্ভুলতা চান, ব্যবহার করুন %N সঙ্গে date(এবং ব্যবহারের bcপরিবর্তন করার জন্য, কারণ $(())শুধুমাত্র পূর্ণসংখ্যার পরিচালনা)।

এটি কীভাবে করবেন তা এখানে:

start=$(date +%s.%N)
# do some stuff here
dur=$(echo "$(date +%s.%N) - $start" | bc)

printf "Execution time: %.6f seconds" $dur

উদাহরণ:

start=$(date +%s.%N); \
  sleep 0.1s; \
  dur=$(echo "$(date +%s.%N) - $start" | bc); \
  printf "Execution time: %.6f seconds\n" $dur

ফলাফল:

Execution time: 0.104623 seconds

15

যদি আপনি সময়ের সাথে পরবর্তী সময়গুলি ব্যবহার করতে চান, তবে কীভাবে সময় সাশ্রয় করবে এমন আউটপুট কোডের-f বিকল্পটি কীভাবে ব্যবহার করবেন তা শিখুন । পুরো শ্রেণিবদ্ধ শিক্ষার্থীদের প্রোগ্রামের সম্পাদনের সময়গুলি পেতে এবং সাজানোর জন্য আমি সম্প্রতি কিছু কোড ব্যবহার করেছি:/usr/bin/time

fmt="run { date = '$(date)', user = '$who', test = '$test', host = '$(hostname)', times = { user = %U, system = %S, elapsed = %e } }"
/usr/bin/time -f "$fmt" -o $timefile command args...

পরে আমি সমস্ত $timefileফাইল কনটানটেটেড করে আউটপুটটিকে লুয়া ইন্টারপ্রেটারে পাইপ করে দিয়েছিলাম । পাইথন বা ব্যাশ বা আপনার পছন্দসই বাক্য গঠন যা যা তা ব্যবহার করে আপনি একই কাজ করতে পারেন। আমি এই কৌশল পছন্দ।


দ্রষ্টব্য: পুরো পথটি /usr/bin/timeপ্রয়োজনীয় কারণ যদিও which timeআপনাকে অন্যথায় বলবে, আপনি যদি কেবল চালনা করেন তবে timeএটি আপনার শেলের সংস্করণটি চালাবে timeযার কোনও যুক্তি স্বীকার করে না।
কেভিন ডাইস

আমি সাথে যেতে হবে env time:-)
Ciro সান্তিলি 法轮功 冠状 病 六四 事件 法轮功

13

আপনার যদি কেবল দ্বিতীয়টির যথার্থতা প্রয়োজন হয় তবে আপনি বিল্টিন $SECONDSভেরিয়েবলটি ব্যবহার করতে পারেন , যা শেলটি চলমান কয়েক সেকেন্ডের গণনা করে cou

while true; do
    start=$SECONDS
    some_long_running_command
    duration=$(( SECONDS - start ))
    echo "This run took $duration seconds"
    if some_condition; then break; fi
done

10

আপনি ব্যবহার timeএবং সাবস্কেল করতে পারেন ():

time (
  for (( i=1; i<10000; i++ )); do
    echo 1 >/dev/null
  done
)

বা একই শেল {}:

time {
  for (( i=1; i<10000; i++ )); do
    echo 1 >/dev/null
  done
}

আপনি দুটি অভিন্ন কোড স্নিপেট পোস্ট করেছেন। আপনার নিশ্চয়ই সেখানে কিছু আলাদা থাকতে হবে।
সোমবার 16:15 '

3
@ স্ট্যাসবেকম্যান সত্য নয়, প্রথমে (& )(নতুন প্রসঙ্গ, সাবশেল ) ব্যবহার করে এবং {& }(একই শেল, একই প্রসঙ্গে)
এডুয়ার্ডো কুওমো

আহা! আমি সত্যিই দু'জনের দিকে তাকাচ্ছিলাম এবং তফাতটি দেখিনি। }} বনাম () পরিষ্কার করার জন্য আপনাকে ধন্যবাদ।

2

উপায় হয়

$ > g++ -lpthread perform.c -o per
$ > time ./per

আউটপুট হল >>

real    0m0.014s
user    0m0.010s
sys     0m0.002s

ট্যাগ -lphtreadবা ব্যবহারের দরকার নেই -o। কেবল timeকমান্ডটি ব্যবহার করা দরকার যা গ্রহণযোগ্য উত্তরগুলি আরও ভালভাবে ব্যাখ্যা করে।
ডেনিস 4

7
এটি একটি উদাহরণ ছিল .এটি আমার পারফরম্যান্স.সি এর থ্রেডিং রয়েছে তাই আমার -পথের প্রয়োজন এবং সাধারণ পরিচয়ের জন্য এটি প্রতি-প্রতি।
রবেল শর্মা

0

একটি সম্ভবত সহজ পদ্ধতি (এটি বিভিন্ন ব্যবহারকারীর প্রয়োজন মেটাতে পারে না) হ'ল শেল PROMPT ব্যবহার। এটি একটি সহজ সমাধান যা কিছু ক্ষেত্রে কার্যকর হতে পারে। আপনি নীচের উদাহরণে যেমন ব্যাশ অনুরোধ বৈশিষ্ট্যটি ব্যবহার করতে পারেন:

PS1 = '[\ t \ u @ \ h] \ $' রফতানি করুন 

উপরের কমান্ডটি শেল প্রম্পটকে এতে পরিবর্তন করবে:

[এইচ এইচ: এমএম: এসএস ব্যবহারকারীর নাম @ হোস্টনাম] $ $ 

প্রতিবার শেল প্রম্পটে ফিরে আপনি যখন কোনও কমান্ড চালান (বা এন্টার টিপুন), প্রম্পটটি বর্তমান সময় প্রদর্শিত হবে।

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


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