লিনাক্সে 'টাইম' কমান্ডের মতো পাওয়ারশেলের কোনও কমান্ড কার্যকর করার সময় কি সহজ উপায় আছে?
আমি এটি নিয়ে এসেছি:
$s=Get-Date; .\do_something.ps1 ; $e=Get-Date; ($e - $s).TotalSeconds
তবে আমি আরও সহজ কিছু চাই
time .\do_something.ps1
লিনাক্সে 'টাইম' কমান্ডের মতো পাওয়ারশেলের কোনও কমান্ড কার্যকর করার সময় কি সহজ উপায় আছে?
আমি এটি নিয়ে এসেছি:
$s=Get-Date; .\do_something.ps1 ; $e=Get-Date; ($e - $s).TotalSeconds
তবে আমি আরও সহজ কিছু চাই
time .\do_something.ps1
উত্তর:
হা.
Measure-Command { .\do_something.ps1 }
মনে রাখবেন যে এর একটি ছোটখাটো ক্ষতি Measure-Command
হচ্ছে আপনি কোনও stdout
আউটপুট দেখতে পাচ্ছেন না ।
[আপডেট, @ জেসনম্যাচারকে ধন্যবাদ] আপনি হোস্টে লেখার জন্য কমান্ড আউটপুটটি কয়েকটি কমান্ডলেটে পাইপ দিয়ে এটি ঠিক করতে পারেন, যেমন Out-Default
এটি হয়ে যায়:
Measure-Command { .\do_something.ps1 | Out-Default }
আউটপুটটি দেখার আরেকটি উপায় হ'ল। নেট Stopwatch
ক্লাসটি এর মতো ব্যবহার করা :
$sw = [Diagnostics.Stopwatch]::StartNew()
.\do_something.ps1
$sw.Stop()
$sw.Elapsed
time { ping -n 1 google.com } -Samples 10
কমান্ডের 10
সময়গুলি চালাবে এবং সর্বনিম্ন, সর্বনিম্ন এবং সর্বাধিক সময় নেওয়া সময় ফিরিয়ে দেবে। আপনি -Silent
STDOUT গিলতে যোগ করতে পারেন ।
$t = Measure-Command {<<your command or code block>>}
। এটি চেষ্টা করে দেখুন এবং তারপর টাইপ $t
প্রম্পটে আপনার ফলাফল এবং সব সম্পত্তি, আপনি মত এক্সেস আছে দেখতে $t.Milliseconds
, $t.TotalSeconds
,, ইত্যাদি তারপর আমরা যাই হোক না কেন আউটপুট আমরা চাই লিখতে পারেন, উদাহরণস্বরূপWrite-Host That command took $t.TotalSeconds to complete.
আপনি ইতিহাস থেকে শেষ কমান্ডটি পেতে এবং এটি EndExecutionTime
থেকে এটি বিয়োগ করতে পারেন StartExecutionTime
।
.\do_something.ps1
$command = Get-History -Count 1
$command.EndExecutionTime - $command.StartExecutionTime
Get-History | Group {$_.StartExecutionTime.Hour} | sort Count -desc
দিনের পর ঘন্টা আপনার পাওয়ারশেল ব্যবহারের ধরণটি দেখতে : এটি একবার চেষ্টা করে দেখুন। :-)
$command = Get-History -Count 1 ; "{0}" -f ($command.EndExecutionTime - $command.StartExecutionTime)
ব্যবহার Measure-Command
উদাহরণ
Measure-Command { <your command here> | Out-Host }
পাইপ আপনাকে Out-Host
কমান্ডের আউটপুট দেখতে দেয় যা অন্যথায় গ্রহন করা হয় Measure-Command
।
Measure-Command {<your command } | Out-Host
- আউট-হোস্ট স্ক্রিপ্ট ব্লকের বাইরে রয়েছে
Simples
function time($block) {
$sw = [Diagnostics.Stopwatch]::StartNew()
&$block
$sw.Stop()
$sw.Elapsed
}
তারপর হিসাবে ব্যবহার করতে পারেন
time { .\some_command }
আপনি আউটপুট টুইট করতে পারেন
Measure-Command
কমান্ড আউটপুট আড়াল করে, তাই এই সমাধানটি কখনও কখনও ভাল হয়।
আমি এখানে একটি ফাংশন লিখেছি যা ইউনিক্স time
কমান্ডের অনুরূপ কাজ করে :
function time {
Param(
[Parameter(Mandatory=$true)]
[string]$command,
[switch]$quiet = $false
)
$start = Get-Date
try {
if ( -not $quiet ) {
iex $command | Write-Host
} else {
iex $command > $null
}
} finally {
$(Get-Date) - $start
}
}
সূত্র: https://gist.github.com/bender-the-greiest/741f696d965ed9728dc6287bdd336874
Measure-Command
কার্যকর করার সময়টিকে আপনি নিজেরাই গণনা করতে পারবেন বা পাওয়ারশেলের মাধ্যমে আপনি মৃত্যুদন্ড কার্যকর করতে পারেন এমন বিভিন্ন উপায়ের একটি হিসাবে। আপনি যদি আসল প্রশ্নটি পড়ে থাকেন তবে তিনি এমন কিছু চেয়েছিলেন যা " time
লিনাক্সের আদেশের মতো " কাজ করে।
স্টপওয়াচ এবং ফর্ম্যাটিং সময় অতিবাহিত:
Function FormatElapsedTime($ts)
{
$elapsedTime = ""
if ( $ts.Minutes -gt 0 )
{
$elapsedTime = [string]::Format( "{0:00} min. {1:00}.{2:00} sec.", $ts.Minutes, $ts.Seconds, $ts.Milliseconds / 10 );
}
else
{
$elapsedTime = [string]::Format( "{0:00}.{1:00} sec.", $ts.Seconds, $ts.Milliseconds / 10 );
}
if ($ts.Hours -eq 0 -and $ts.Minutes -eq 0 -and $ts.Seconds -eq 0)
{
$elapsedTime = [string]::Format("{0:00} ms.", $ts.Milliseconds);
}
if ($ts.Milliseconds -eq 0)
{
$elapsedTime = [string]::Format("{0} ms", $ts.TotalMilliseconds);
}
return $elapsedTime
}
Function StepTimeBlock($step, $block)
{
Write-Host "`r`n*****"
Write-Host $step
Write-Host "`r`n*****"
$sw = [Diagnostics.Stopwatch]::StartNew()
&$block
$sw.Stop()
$time = $sw.Elapsed
$formatTime = FormatElapsedTime $time
Write-Host "`r`n`t=====> $step took $formatTime"
}
ব্যবহারের নমুনা
StepTimeBlock ("Publish {0} Reports" -f $Script:ArrayReportsList.Count) {
$Script:ArrayReportsList | % { Publish-Report $WebServiceSSRSRDL $_ $CarpetaReports $CarpetaDataSources $Script:datasourceReport };
}
StepTimeBlock ("My Process") { .\do_something.ps1 }
উত্তরে বর্ণিত পারফরম্যান্স পরিমাপ কমান্ডগুলির যে কোনও থেকে অঙ্কন (ভুল) সিদ্ধান্তে কেবল একটি শব্দ। অনেকগুলি বিপদ রয়েছে যা একটি (কাস্টম) ফাংশন বা কমান্ডের খালি প্রার্থনার সময়টির দিকে তাকানো বাদে বিবেচনা করা উচিত।
'জাজেমেলসফটওয়্যার' ২০১৫ সালের ডাচ শব্দটিকে ভোট দিয়েছে
জাজোমেলেন মানে প্রতারণা, এবংভক্সওয়াগেন নির্গমন কেলেঙ্কারির কারণে সজোমেলসফ্টওয়্যার শব্দটি চালু হয়েছিল। অফিসিয়াল সংজ্ঞাটি "পরীক্ষার ফলাফলগুলিকে প্রভাবিত করতে ব্যবহৃত সফ্টওয়্যার"।
ব্যক্তিগতভাবে, আমি মনে করি যে " সজোমেলসফটওয়্যার " সর্বদা ইচ্ছাকৃতভাবে পরীক্ষার ফলাফল প্রতারণার জন্য তৈরি করা হয় না তবে নীচের চিত্রের মতো পরীক্ষার ক্ষেত্রে অনুরূপ ব্যবহারিক পরিস্থিতির সাথে মিলিত হতে পারে।
উদাহরণস্বরূপ, তালিকাভুক্ত কর্মক্ষমতা পরিমাপ কমান্ডগুলি ব্যবহার করে ল্যাঙ্গুয়েজ ইন্টিগ্রেটেড ক্যোয়ারী (লাইনকিউ) (1) , প্রায়শই কিছু করার জন্য দ্রুততম উপায় হিসাবে যোগ্য হয় এবং এটি প্রায়শই হয় তবে অবশ্যই সর্বদা হয় না! নেটিভ পাওয়ারশেল কমান্ডগুলির সাথে তুলনা করে 40 বা ততোধিক গুণকের গতির বৃদ্ধি পরিমাপ করে যে কেউ সম্ভবত ভুলভাবে পরিমাপ বা একটি ভুল উপসংহার আঁকছেন।
মুল বক্তব্যটি হ'ল কয়েকটি নেট নেট ক্লাস (যেমন লিনকিউ) অলস মূল্যায়ন ব্যবহার করে (এটিকে মুলতুবি কার্যকরকরণ (2) হিসাবেও চিহ্নিত করা হয় )। এর অর্থ হ'ল যখন কোনও ভেরিয়েবলের কাছে কোনও এক্সপ্রেশন নির্ধারণ করা হয়, এটি প্রায় সঙ্গে সঙ্গেই হয়ে গেছে বলে মনে হয় তবে বাস্তবে এটি এখনও কোনও কিছুতেই প্রক্রিয়া করেনি!
ধরে নেওয়া যাক আপনি আপনার কমান্ডটি ডট-সোর্স দিয়েছিলেন. .\Dosomething.ps1
যার মধ্যে একটি পাওয়ারশেল বা আরও পরিশীলিত লিনক এক্সপ্রেশন রয়েছে (ব্যাখ্যা সহজ করার জন্য, আমি সরাসরি অভিব্যক্তিগুলিকে সরাসরি এম্বেড করেছি Measure-Command
):
$Data = @(1..100000).ForEach{[PSCustomObject]@{Index=$_;Property=(Get-Random)}}
(Measure-Command {
$PowerShell = $Data.Where{$_.Index -eq 12345}
}).totalmilliseconds
864.5237
(Measure-Command {
$Linq = [Linq.Enumerable]::Where($Data, [Func[object,bool]] { param($Item); Return $Item.Index -eq 12345})
}).totalmilliseconds
24.5949
ফলাফল সুস্পষ্টভাবে উপস্থিত হয়, পরবর্তী লিনক কমান্ডটি প্রথম পাওয়ারশেল কমান্ডের চেয়ে প্রায় 40 গুণ বেশি দ্রুত । দুর্ভাগ্যবশত, এটা হয় না যে সহজ ...
এর ফলাফলগুলি প্রদর্শিত হবে:
PS C:\> $PowerShell
Index Property
----- --------
12345 104123841
PS C:\> $Linq
Index Property
----- --------
12345 104123841
যেমনটি প্রত্যাশা করা হয়েছিল, ফলাফলগুলি একই তবে আপনি যদি মনোযোগ দিয়ে মনোযোগ দিয়ে থাকেন তবে আপনি খেয়াল করে দেখতে পাবেন যে $Linq
ফলাফলগুলি প্রদর্শন করতে অনেক বেশি সময় লেগেছিল তারপরে $PowerShell
ফলাফলগুলি।
আসুন বিশেষভাবে পরিমাপ যে শুধু ফলে বস্তুর একটি সম্পত্তি পুনরুদ্ধারের দ্বারা:
PS C:\> (Measure-Command {$PowerShell.Property}).totalmilliseconds
14.8798
PS C:\> (Measure-Command {$Linq.Property}).totalmilliseconds
1360.9435
অবজেক্টটির কোনও সম্পত্তি পুনরুদ্ধার করতে এটি 90 গুণ বেশি সময় নিয়েছিল এবং এটি কেবল একটি একক বস্তু!$Linq
$PowerShell
অন্য একটি ক্ষতির বিষয়টিও লক্ষ্য করুন যে আপনি যদি এটি আবার করেন তবে কিছু ধাপ আগে খুব দ্রুত প্রদর্শিত হতে পারে, কারণ এর কিছু অভিব্যক্তি ক্যাশে হয়েছে।
নীচের লাইনটি, আপনি যদি দুটি ফাংশনের মধ্যে পারফরম্যান্স তুলনা করতে চান, আপনাকে আপনার ব্যবহৃত ক্ষেত্রে এগুলি প্রয়োগ করতে হবে, একটি নতুন পাওয়ারশেল সেশন দিয়ে শুরু করতে হবে এবং সম্পূর্ণ সমাধানের আসল কর্মক্ষমতা সম্পর্কে আপনার সিদ্ধান্তকে ভিত্তি করতে হবে।
(1) পাওয়ারশেল এবং লিনকিউ সম্পর্কে আরও পটভূমি এবং উদাহরণগুলির জন্য, আমি তিহিসি সাইটের সুপারিশ করছি: লিনকুই সহ উচ্চ পারফরম্যান্স পাওয়ারশেল
(২) আমি মনে করি যে অলস মূল্যায়নের সাথে দুটি ধারণার মধ্যে একটি সামান্য পার্থক্য রয়েছে যখন প্রয়োজন অনুসারে ফলাফল গণনা করা হবে স্থগিত কার্যকরকরণের ফলাফলটি গণনা করা হয় যখন সিস্টেম অলস থাকে