সেকেন্ডের ভগ্নাংশের জন্য ঘুমের জন্য একটি লুপ দরকার


14

আমার মেশিনে আমাকে একটি চক্র কার্যকর করতে হবে যা 1 সাধারণ কমান্ডের পুনরাবৃত্তি করে যা অবশ্যই দ্বিতীয়টির ভগ্নাংশে প্রকাশিত হতে পারে delay

আসুন বলি যে আমার প্রয়োজন:

  • ক্রমবর্ধমান এনামিউরেশন (ফাইল -0, ফাইল -1, ফাইল -2, ...) দিয়ে একটি ফাইল সংরক্ষণ করতে যেমন উদাহরণের জন্য তুচ্ছ কিছু দিয়ে উত্পন্ন time > file-$x
  • আমাকে প্রতি 1/70 সেকেন্ডে এটি করা দরকার (উদাহরণস্বরূপ) কারণ আমি আমার সময়টি সেকেন্ডের ভগ্নাংশের সাথে প্রকাশ করতে চাই।

আমি কীভাবে সত্যই নির্ভুল হতে পারি এবং বাশ স্ক্রিপ্ট দিয়ে সমস্ত কিছু প্রকাশ করতে পারি?

ভগ্নাংশটি একটি অনিবার্য পরিমাণ উত্পন্ন করতে পারে, আমার সুনির্দিষ্ট হওয়া দরকার এবং তাই আমার কমপক্ষে 4-5 দশমিকের প্রয়োজন।

উত্তর:


12

ভগ্নাংশ থেকে দশকে দশমিক দশকে রূপান্তর করতে, এমন কিছু করুন

myvar=$(echo "scale=4; 5/10" | bc)

তারপরে, এই মানটির উপর একটি লুপ করতে,

for i in $(seq 1 1000); do sleep $myvar; done

দেবিয়ান (জিএনইউ) এর উপরে আমার ঘুমের বাস্তবায়ন দশমিক ঘুমের মান গ্রহণ করে বলে মনে হচ্ছে।

দুর্ভাগ্যবশত ..

সেই ধরণের নির্ভুলতার সাথে (4-5 দশমিক স্থান), আপনি পার্ল স্ক্রিপ্ট বা একটি সংকলিত প্রোগ্রামের মতো কিছু পেতে চাইছেন; লুপের মধ্যে যে কোনও প্রোগ্রামকে কল করার ওভারহেড প্রচুর পরিমাণে জিটার যুক্ত করতে চলেছে। স্লিপ কল করতে নিজেই কয়েক মিলি সেকেন্ড লাগবে।

নিম্নলিখিতটি বিবেচনা করুন, 1000 বার সম্পন্ন হওয়া দ্বিতীয় ঘুমের 1 / 10,000 তম অংশ:

time for i in $(seq 1 1000); do sleep 0.0001; done

real    0m2.099s
user    0m3.080s
sys     0m1.464s

প্রত্যাশিত ফলাফলটি সেকেন্ডের 1/10 তম হবে। আপনার যে সহিষ্ণুতা চান তা ঘুমের কোথাও নেই।

/programming/896904/how-do-i-sleep-for-a-millisecond-in-perl

পার্লের সময় ব্যবহার করে: হাইরেস, 1000 * 1000 মাইক্রোসেকেন্ড:

my $i=0;
for($i=0;$i<=1000;$i++) {
        usleep(1000);
}

real    0m1.133s
user    0m0.024s
sys     0m0.012s

আমাদের এক সেকেন্ডের অনেক কাছাকাছি দেয়।


যদি 4-5 দশমিক অর্জন করা সম্ভব না হয় তবে আমি বিকল্প হিসাবে সেরা সম্ভাব্য ফলাফলটি গ্রহণ করতে পারি, তবে আমার বক্তব্যটি হ'ল দশমিক বা সেকেন্ড না হয়ে আমাকে ভগ্নাংশে প্রকাশ করা দরকার।
ব্যবহারকারী 1717079

বাশ সহ যে কোনও স্ক্রিপ্টিং ভাষায় ভগ্নাংশকে দশমিক দশকে রূপান্তর করা একেবারে তুচ্ছ। যেমন প্রতিধ্বনি "স্কেল = 4; 5/10" | বিসি
রব বোস

এখন আমি কীভাবে
ভাবটি

হ্যাঁ, আপনি যদি সেকেন্ডের 1/10 তম চেয়ে অনেক বেশি সুনির্দিষ্ট কিছু চান তবে আপনি সম্ভবত পার্ল বা পাইথন চাইবেন যাতে লুপের মধ্যে ওভারহেডের কলিং প্রোগ্রামটি এড়ানো যায়।
রব বোস

7

সম্ভবত আপনি চালাতে পারেন

sleep 0.7

?

man 1 sleep

আমার archlinuxডিস্ট্রোতে:

বর্ণনাটি সেকেন্ডের জন্য বিরতি দিন। SUFFIX সেকেন্ডের জন্য 's' (ডিফল্ট), কয়েক মিনিটের জন্য 'm', কয়েক ঘন্টা 'h' বা কয়েক দিনের জন্য 'd' হতে পারে। বেশিরভাগ বাস্তবায়নের বিপরীতে যেটির জন্য NUMBER প্রয়োজন পূর্ণসংখ্যার প্রয়োজন, এখানে NUMBER একটি নির্বিচারে ভাসমান পয়েন্ট নম্বর হতে পারে। দুই বা ততোধিক যুক্তি দেওয়া, তাদের মানগুলির যোগফল দ্বারা নির্দিষ্ট সময়ের পরিমাণের জন্য বিরতি দিন।


sleepভগ্নাংশ অনুমতি দেয়? আপনি একটি জাল লুপ দিয়ে একটি সম্পূর্ণ উদাহরণ দিতে পারেন?
ব্যবহারকারী 1717079

0.7 এটি কোনও ভগ্নাংশ নয় যা আমার সমস্যা প্রকাশ করে ... আমার সমস্যা দানাদারত্ব সম্পর্কে; 1/3 সম্পর্কে চিন্তা করুন এবং ঘুমের সাথে সুনির্দিষ্ট হওয়ার চেষ্টা করুন।
ব্যবহারকারী 1717079

6

কোনও প্রক্রিয়া তৈরি করা এবং এতে একটি নতুন এক্সিকিউটেবল লোড করা কয়েক মিলিসেকেন্ড নেওয়ার সম্ভাবনা রয়েছে, যাতে এই ধরণের নির্ভুলতা সত্যিকার অর্থে বোঝা যায় না। এছাড়াও নোট করুন যে অনেক সিস্টেমে সিপিইউ সময় 10 মিমি পর্যন্ত স্লাইস করে প্রক্রিয়াগুলিতে বরাদ্দ করা হয়।

এটি বলার পরে, কিছু sleepবাস্তবায়নগুলি সেকেন্ডের ভগ্নাংশের সংখ্যা নেয় এবং zsh এবং ksh93 উভয়ই তাদের $SECONDSবিশেষ পরিবর্তনশীল ভগ্নাংশটি তৈরি করতে পারে typeset -F SECONDS

উদাহরণ (zsh):

$ typeset -F SECONDS=0; for ((i=1; i<=70; i++)); do sleep $((1./70)); date +%s.%N; done | { head -n3;echo ..;tail -n3; }; echo $SECONDS
1350076317.374870501
1350076317.391034397
1350076317.407278461
..
1350076318.464585550
1350076318.480887660
1350076318.497133050
1.1393780000

ওফফ, এটি প্রস্ফুটিত আপনি ঘুমের সময় এর উপর ভিত্তি করে সামঞ্জস্য করতে পারেন $SECONDS:

$ typeset -F SECONDS=0; for ((i=1; i<=70; i++)); do sleep $((i/70. - SECONDS)); date +%s.%N; done | { head -n3;echo ...;tail -n3; }; echo $SECONDS
1350076420.262775654
1350076420.277012997
1350076420.291302750
../..
1350076421.219682227
1350076421.234134663
1350076421.248255685
1.0020580000

এই 2 অতিরিক্ত মিলিসেকেন্ডগুলি সম্ভবত শেষ sleepএবং dateকমান্ডগুলি চালনার জন্য গণ্য হবে ।

আরও মনে রাখবেন যে zsh এর একটি zselectঅন্তর্নির্মিত সময়সীমা সহ দ্বিতীয় সেকেন্ডে প্রকাশিত হয়েছে। এবং ksh93 sleepবিল্ট ইন করেছে (এবং ভাসমান পয়েন্টগুলি গ্রহণ করে) এবং এটি printfতারিখ / সময়গুলি মুদ্রণ করতে পারে।

$ typeset -F SECONDS=0; for ((i=1; i<=70; i++)); do ((i<4 || i>67)) && printf '%(%S.%N)T\n' now; sleep $((i/70.-SECONDS)); done; echo $SECONDS
20.823349000
20.837510000
20.851663000
21.780099000
21.794254000
21.808405000
0.9992358685

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


sleep 1/70আমার মেশিনে অনুমতি নেই ...
ব্যবহারকারীর 1717079

এমনকি আমি কী অর্জন করতে চাই তার কাছেও নয়, কীভাবে আমি জিনিসগুলি দ্রুত কার্যকর করতে পারি?
ব্যবহারকারী 1717079

দুঃখিত, ভগ্নাংশের দ্বারা, আমি বোঝাতে চাইনি এন / মি হিসাবে প্রকাশিত যেখানে এন এবং এম পূর্ণসংখ্যা, তবে ভগ্নাংশের সাথে দশমিক হিসাবে। আমি মনে করি আপনি তাদেরকে দশমিক ভাসমান পয়েন্ট নম্বরও বলতে পারেন যদিও আমি যথাযথ ইংরেজি পরিভাষা সম্পর্কে নিশ্চিত নই
স্টাফেন চেজেলাস

আমি মনে করি যে আমি শেলটি এড়াতে যাচ্ছি ...
ব্যবহারকারী 1717079

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

3

যদি আপনার শেল এর sleepভগ্নাংশ গ্রহণ না করে তবে পার্ল ব্যবহার করুন।

sleep_fraction() {
  /usr/bin/perl -e "select(undef, undef, undef, $1)"
}

sleep_fraction 0.01428

আপনার যদি ভগ্নাংশটি সন্ধান করতে হয় তবে ব্যবহার করুন echo "scale=5; 1/70" | bc


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