2016-04-07 12 views
4

VBS'den dönüştürdüğüm bir powershell oturum açma komut dosyasının performansını artırmaya çalışıyorum ve testlerimde bir sorunla karşılaştım. Ölçü-Komutu veya StopWatch Karışık/Yanlış Sonuçları Geri Alma

Ben şimdiki makineye bağlı tüm sürücüleri alınırken en hızlı yolu denemek ve bulmak için aşağıdaki testi yazdı:

################################################################# PSDrive 
Measure-Command { Get-PSDrive -PSProvider 'FileSystem' } 

$sw = [Diagnostics.Stopwatch]::StartNew() 

Get-PSDrive -PSProvider 'FileSystem' 

$sw.Stop() 
$elapsed = $sw.Elapsed.TotalMilliseconds 
write-host $elapsed 
############################################################# END PSDrive 

##################################################################### WMI 
Measure-Command { Get-WMIObject -query "Select * From Win32_LogicalDisk Where DriveType = 4" } 

$sw = [Diagnostics.Stopwatch]::StartNew() 

Get-WMIObject -query "Select * From Win32_LogicalDisk Where DriveType = 4" 

$sw.Stop() 
$elapsed = $sw.Elapsed.TotalMilliseconds 
write-host $elapsed 
################################################################# END WMI 

Gördüğünüz gibi ben sürücüleri almak için 2 farklı yöntem kullanıyorum:

Get-PSDrive

Get-WMIObject

Ben de th ölçmek için 2 farklı teknikler kullanıyorum

Her komut e hızı:

[Diagnostics.Stopwatch]::StartNew()

Measure-Command

Bununla birlikte, Şekil 2, tahrik-alma teknikleri her yöntem için gerekli süreyi ölçmek için kullanılan bağlı olarak daha hızlı olarak ölçülür.

Get PsDrive

ölçün Komutanlığı (TotalMilliseconds): Bu, yukarıda senaryo bazı örnek çıkışı (sadece ilgili ayrıntıları dahil ettik) 'dir 0,6983

Kronometre (TotalMilliseconds) : 408.9745

ölçün-WMIObject alın Komut (TotalMilliseconds): 46,8607

Kronometre (TotalMilliseconds): 158,0209

Kronometre (TotalMilliseconds): 158,0209


Benim soru daha güvenilir hangisinin (eğer varsa), nedir? Ya da kodumu bu şekilde toplam zaman kaybı ölçmeye mi çalışıyor? Bu konuda herhangi bir yardım için çok teşekkür ederiz.


Güncelleme

bir değişken (örn $x = Get-PSDrive -PsProvider 'FileSystem') içine her komutu göndermek için kod Değişik ve şimdi çıkış çok daha mantıklıdır:

Get PsDrive

Ölçü Komutu (TotalMilliseconds): 0,6983

Kronometre (TotalMilliseconds): 408.9745

al-WMIObject

ölçün Komutanlığı (TotalMilliseconds): 46,8607

Kronometre (TotalMilliseconds): 158,0209

cevap

5

Measure-Command Tek gereken sadece zaman ölçme, boru hattı çıkışı atar komutu gerçekten yürütmek için.

Kronometre zamanlayıcısı, komutu yürütmek için gereken süreyi ölçer ve daha sonra tüm çıkışı konsola görüntüler.

Konsola yazmak için gereken süreyi ölçmek için Measure-Command'u almak üzere, ölçmekte olduğunuz komut satırında Out-Host'a açık bir boru ekleyin. Daha sonra konsola yazılan çıktıyı ve tamamlanması için ölçülen zamanda karşılık gelen bir artışı görmelisiniz.

+0

Bu doğru görünüyor - teşekkürler Mjolinor. Konsola yazdırmak için harcanan süreyi yakalamak için Measure-Command almanın bir yolu olup olmadığını biliyor musunuz? Ben $ x = [statement] ölçtüğümde; $ x' hala ilk parçayı ölçüyor gibi görünüyor ve ekrana yazılan parçayı hesaba katmıyor – Bassie

+2

Ölçüm yaptığınız komut satırında Out-Host'a açık bir boru ekleyin. Daha sonra konsola yazılan çıktıyı ve tamamlanması için ölçülen zamanda karşılık gelen bir artışı görmelisiniz. – mjolinor