পাওয়ারশলে একটি কমান্ড কার্যকর করার সময়সীমা


217

লিনাক্সে 'টাইম' কমান্ডের মতো পাওয়ারশেলের কোনও কমান্ড কার্যকর করার সময় কি সহজ উপায় আছে?
আমি এটি নিয়ে এসেছি:

$s=Get-Date; .\do_something.ps1 ; $e=Get-Date; ($e - $s).TotalSeconds

তবে আমি আরও সহজ কিছু চাই

time .\do_something.ps1

উত্তর:


337

হা.

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

114
আপনি এর মতো আউটপুটও দেখতে পাবেন, মেজার-কমান্ড {PS | আউট-ডিফল্ট}। বা হোস্টের কাছে সরাসরি লিখিত অন্য কিছু, যা কার্যকর হতে পারে বা নাও পারে।
জেসনমারচার

18
আমি এই সমাধানটি নিয়েছি এবং এমন একটি ফাংশন লিখেছি যা অন্য কারও পক্ষে কার্যকর হতে পারে। gist.github.com/2206444 - উদাহরণ: time { ping -n 1 google.com } -Samples 10কমান্ডের 10সময়গুলি চালাবে এবং সর্বনিম্ন, সর্বনিম্ন এবং সর্বাধিক সময় নেওয়া সময় ফিরিয়ে দেবে। আপনি -SilentSTDOUT গিলতে যোগ করতে পারেন ।
জোশোয়াপোহল্স

13
আমার পছন্দ হ'ল পরিমাপ-কমান্ডের ফলাফলটি একটি ভেরিয়েবলের মতো নির্ধারণ করা $t = Measure-Command {<<your command or code block>>}। এটি চেষ্টা করে দেখুন এবং তারপর টাইপ $tপ্রম্পটে আপনার ফলাফল এবং সব সম্পত্তি, আপনি মত এক্সেস আছে দেখতে $t.Milliseconds, $t.TotalSeconds,, ইত্যাদি তারপর আমরা যাই হোক না কেন আউটপুট আমরা চাই লিখতে পারেন, উদাহরণস্বরূপWrite-Host That command took $t.TotalSeconds to complete.
Baodad

দ্রুত ব্যবহার কি? নেট.স্টপওয়াচ, বা পরিমাপ-কমান্ড, বা কেবল দুটি গেট-ডেট ওয়ার্সের সাথে তুলনা করা ... (আমার অর্থ
হ'ল

সম্ভবত জেসনমারচারের মন্তব্যের সংক্ষিপ্তসার অন্তর্ভুক্ত করুন (সুতরাং এটি সম্পূর্ণ স্পষ্টভাবে স্পষ্ট যে এটি পুরো পাওয়ারশেল স্ক্রিপ্টের চেয়ে আরও সূক্ষ্মভাবে ব্যবহার করা যেতে পারে)?
পিটার মর্টেনসেন

183

আপনি ইতিহাস থেকে শেষ কমান্ডটি পেতে এবং এটি EndExecutionTimeথেকে এটি বিয়োগ করতে পারেন StartExecutionTime

.\do_something.ps1  
$command = Get-History -Count 1  
$command.EndExecutionTime - $command.StartExecutionTime

22
Get-History | Group {$_.StartExecutionTime.Hour} | sort Count -descদিনের পর ঘন্টা আপনার পাওয়ারশেল ব্যবহারের ধরণটি দেখতে : এটি একবার চেষ্টা করে দেখুন। :-)
কিথ হিল

18
আপনি যখন শুরু করেছিলেন তখন খুব বেশি সময় লাগবে এমন কিছুর পরেও আপনি কতক্ষণ সময় নেননি তা জানতে এটি ব্যবহার করতে সক্ষম হওয়ায় আপনি এটি পরিমাপ-কমান্ডে মোড়ানোর কথা ভাবেন নি।
ক্রিস ম্যাগনসন

3
পাওয়ারশেল কখনও কখনও দুর্দান্ত হয়।
কনস্টান্টাইনেকে

আমি আশা করি আমি আপনাকে কেবল +1 এর চেয়ে বেশি দিতে পারব :)
ডেভিড ফেরেনসি রোোগোয়ান

হ্যাঁ, এটি দুর্দান্ত! আমি এটি ব্যবহার করে একটি লাইন তৈরি করেছি:$command = Get-History -Count 1 ; "{0}" -f ($command.EndExecutionTime - $command.StartExecutionTime)
ফিল

106

ব্যবহার Measure-Command

উদাহরণ

Measure-Command { <your command here> | Out-Host }

পাইপ আপনাকে Out-Hostকমান্ডের আউটপুট দেখতে দেয় যা অন্যথায় গ্রহন করা হয় Measure-Command


আমি মনে করি আপনার অর্থ Measure-Command {<your command } | Out-Host - আউট-হোস্ট স্ক্রিপ্ট ব্লকের বাইরে রয়েছে
পিটার ম্যাকভয়

1
@ পিটার - এটি ব্লকের ভিতরে থাকা দরকার, অন্যথায় কনসোলে যাওয়ার আগে মেজার-কমান্ড আউটপুট গ্রাস করে।
দ্রোজ

1
গোছা ... সেক্ষেত্রে আপনার পাইপের দরকারও পড়বে না। এটি কেবল ফলাফলগুলি মুদ্রণ করা উচিত, যদি না আপনি এটি অন্য কোনও ব্লকে মুড়ে ফেলে থাকেন ....
দ্রোজ

2
স্ক্রিপ্টিংয়ের সাথে সামঞ্জস্যপূর্ণ হওয়ার কারণে আউট-ডিফল্ট কি আউট-হোস্টের চেয়ে ভাল হতে পারে? jsnover.com/blog/2013/12/07/write-host-considered-harmful
মার্চ

1
আচ্ছা আমি আউট-ডিফল্ট চেষ্টা করেছিলাম এবং এটি টার্মিনালেও ঠিক কাজ করে, তবে কেন সর্বদা আউট-ডিফল্ট ব্যবহার করবেন না? (আমি এটি কোনও স্ক্রিপ্টে চেষ্টা করে
দেখিনি

18

Simples

function time($block) {
    $sw = [Diagnostics.Stopwatch]::StartNew()
    &$block
    $sw.Stop()
    $sw.Elapsed
}

তারপর হিসাবে ব্যবহার করতে পারেন

time { .\some_command }

আপনি আউটপুট টুইট করতে পারেন


1
Measure-Commandকমান্ড আউটপুট আড়াল করে, তাই এই সমাধানটি কখনও কখনও ভাল হয়।
কোডকাইজন

এটি একটি দুর্দান্ত সমাধান, যা কমান্ডের আউটপুটকে সম্মান করে। আপনি সাধারণ কমান্ডগুলির জন্য কোঁকড়া ধনুর্বন্ধনী ছাড়াই এটিও আহ্বান করতে পারেন, উদাহরণস্বরূপ: "টাইম এলএস", আপনি ইউনিক্সে ঠিক তেমনই করেছিলেন।
রাউল সালিনাস-

5

আমি এখানে একটি ফাংশন লিখেছি যা ইউনিক্স 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


প্রশ্নটি ছিল "পাওয়ারশেলের একটি কমান্ড কার্যকর করার সময় নির্ধারণ করা"। এর সাথে ইউনিক্স ব্যবহারের প্রক্রিয়া নির্ধারণের সময় কী হয়?
জিন-ক্লড ডেমার্স

5
এটি একটি পাওয়ারশেল ফাংশন যা আমি লিখেছি, যা দেখায় কিভাবে Measure-Commandকার্যকর করার সময়টিকে আপনি নিজেরাই গণনা করতে পারবেন বা পাওয়ারশেলের মাধ্যমে আপনি মৃত্যুদন্ড কার্যকর করতে পারেন এমন বিভিন্ন উপায়ের একটি হিসাবে। আপনি যদি আসল প্রশ্নটি পড়ে থাকেন তবে তিনি এমন কিছু চেয়েছিলেন যা " timeলিনাক্সের আদেশের মতো " কাজ করে।
সবচেয়ে বড়

3

স্টপওয়াচ এবং ফর্ম্যাটিং সময় অতিবাহিত:

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 }

-2

উত্তরে বর্ণিত পারফরম্যান্স পরিমাপ কমান্ডগুলির যে কোনও থেকে অঙ্কন (ভুল) সিদ্ধান্তে কেবল একটি শব্দ। অনেকগুলি বিপদ রয়েছে যা একটি (কাস্টম) ফাংশন বা কমান্ডের খালি প্রার্থনার সময়টির দিকে তাকানো বাদে বিবেচনা করা উচিত।

Sjoemelsoftware

'জাজেমেলসফটওয়্যার' ২০১৫ সালের ডাচ শব্দটিকে ভোট দিয়েছে
জাজোমেলেন মানে প্রতারণা, এবংভক্সওয়াগেন নির্গমন কেলেঙ্কারির কারণে সজোমেলসফ্টওয়্যার শব্দটি চালু হয়েছিল। অফিসিয়াল সংজ্ঞাটি "পরীক্ষার ফলাফলগুলিকে প্রভাবিত করতে ব্যবহৃত সফ্টওয়্যার"।

ব্যক্তিগতভাবে, আমি মনে করি যে " সজোমেলসফটওয়্যার " সর্বদা ইচ্ছাকৃতভাবে পরীক্ষার ফলাফল প্রতারণার জন্য তৈরি করা হয় না তবে নীচের চিত্রের মতো পরীক্ষার ক্ষেত্রে অনুরূপ ব্যবহারিক পরিস্থিতির সাথে মিলিত হতে পারে।

উদাহরণস্বরূপ, তালিকাভুক্ত কর্মক্ষমতা পরিমাপ কমান্ডগুলি ব্যবহার করে ল্যাঙ্গুয়েজ ইন্টিগ্রেটেড ক্যোয়ারী (লাইনকিউ) (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) পাওয়ারশেল এবং লিনকিউ সম্পর্কে আরও পটভূমি এবং উদাহরণগুলির জন্য, আমি তিহিসি সাইটের সুপারিশ করছি: লিনকুই সহ উচ্চ পারফরম্যান্স পাওয়ারশেল
(২) আমি মনে করি যে অলস মূল্যায়নের সাথে দুটি ধারণার মধ্যে একটি সামান্য পার্থক্য রয়েছে যখন প্রয়োজন অনুসারে ফলাফল গণনা করা হবে স্থগিত কার্যকরকরণের ফলাফলটি গণনা করা হয় যখন সিস্টেম অলস থাকে


এই উত্তরটির উদ্দেশ্যটি হ'ল পাওয়ারশেলের টাইমিং কমান্ডের সাথে সাধারণ ভুল ধারণা ধারণার জন্য লোককে একটি সাধারণ প্রশ্নে উল্লেখ করতে সক্ষম হওয়া , যেমন আমি কেবল পুনরাবৃত্তি করা প্রশ্নের মতো করেছি: পাওয়ারশেল প্রশ্ন - 500 কে অবজেক্টের মাধ্যমে লুপ করার দ্রুততম পদ্ধতির সন্ধান অন্য
500k
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.