Windows เทียบเท่ากับคำสั่ง "เวลา" ของ UNIX


69

ดังนั้น Unix จึงมีtimeคำสั่งที่ให้ผู้ใช้ตั้งเวลารหัส / สิ่งอื่น ๆ ฉันสงสัยว่าบรรทัดคำสั่ง Windows มีอะไรที่คล้ายกันหรือไม่

นอกจากนี้ผมถามคำถามก่อนหน้านี้เกี่ยวกับบรรทัดคำสั่งลินุกซ์ที่นี่ เราสามารถทำสิ่งเดียวกันกับ Windows ได้หรือไม่? ถ้าเป็นเช่นนั้นได้อย่างไร


2
Windows มี cmd.exe มาตรฐาน แต่ถ้าคุณต้องการบางสิ่งที่ใกล้เคียงกับรุ่น linux จะได้รับ PowerShell มันจะดีกว่า
Guillermo Siliceo Trueba

ฉันค้นหา "เวลาคำสั่งสำหรับ windows" บน google ในผลลัพธ์แรกให้: http://stackoverflow.com/questions/673523/how-to-measure-execution-time-of-command-in-windows-command-line/
David Michel

ฉันใช้ Windows 7 และฉันลองวิธีแก้ปัญหาที่โพสต์ไว้ด้านบน ฉันได้รับข้อผิดพลาดต่อไปนี้: Unable to query system performance data (c0000004). ฉัน googled มันและคนอื่นมีปัญหาเดียวกันแน่นอน แต่ฟอรัมไม่แนะนำวิธีแก้ปัญหา ขอบคุณสำหรับคำแนะนำต่อไป มีคนแนะนำอะไรให้อีกส่วนหนึ่งได้ไหม
ประสิทธิภาพ

@eff, timeit.exe ใช้สำหรับเซิร์ฟเวอร์ 2003 และ XP AFAIK ฉันไม่คิดว่ามันเข้ากันได้กับ 7
John T

คำตอบ:


57

ใช้ Powershell

Measure-Command {start-process whateveryouwantexecute -Wait}

แก้ไขตามความต้องการของคุณ @efficlsBliss:

Measure-Command {start-process java -argumentlist "whateverargumentisneeded" -wait}

นี่คือสิ่งที่ฉันพยายาม: Measure-Command {java test <inputfile> -Wait}. ฉันได้รับรายการสถิติเกี่ยวกับเวลา แต่ไม่ได้ผลลัพธ์จากโค้ด ฉันกำลังทำอะไรผิดหรือเปล่า?
ประสิทธิภาพ

@efficiency: คุณลืมstart-processคำสั่ง
Sasha Chedygov

เริ่มต้นกระบวนการ: ไม่พบพารามิเตอร์ตำแหน่งที่ยอมรับอาร์กิวเมนต์ '. \ 6-8.txt' ที่บรรทัด: 1 อักขระ: 31 + คำสั่งการวัด {เริ่มกระบวนการ <<<< java. \ dancebattle. \ 6-8.txt -wait} + CategoryInfo: InvalidArgument: (:) [กระบวนการเริ่มต้น], ParameterBindingException + FullyQualifiedErrorId : PositionalParameterNotFound, Microsoft.PowerShell.Commands.StartProcessCommand`
efficiencyIsBliss

1
Measure-Command {start-process \Python27\python test.py -Wait}ฉันพยายามที่จะวัดเวลาที่ใช้ในการเรียกใช้สคริปต์หลามใช้ สิ่งนี้จะเปิดหน้าต่าง cmd ใหม่เพื่อเรียกใช้กระบวนการ แต่จะปิดหน้าต่างเมื่อทำงานเสร็จแล้ว ฉันต้องการเห็นผลลัพธ์ของสคริปต์ด้วยดังนั้นฉันจะเปิดหน้าต่างได้อย่างไร?
John Peter Thompson Garcés

2
@ JohnPeterThompsonGarcésใช้พารามิเตอร์ -NoNewWindow ของ cmdlet กระบวนการเริ่มต้น
mjsr

21

ฉันใช้ Win XP ด้วยเหตุผลบางอย่างใช้timeit.exeไม่ได้สำหรับฉัน ฉันพบทางเลือกอื่น ptime:

ptime 1.0 - วัดเวลาดำเนินการของโปรแกรมอย่างแม่นยำ

ptime จะรันคำสั่งและพารามิเตอร์ใด ๆ ที่ระบุและวัดเวลาดำเนินการ (เวลาทำงาน) ในหน่วยวินาทีแม่นยำถึง 5 มิลลิวินาทีหรือดีกว่า มันเป็นตัวจับเวลากระบวนการอัตโนมัติหรือโปรแกรมจับเวลาที่ใช้สำหรับวัตถุประสงค์มาตรฐาน


ptime มีบั๊กเล็ก ๆ ptime ส่งคืนค่า 0 เป็นระดับข้อผิดพลาดเสมอแม้ว่าโปรแกรม "child" จะออกจากข้อผิดพลาด
Yura Shinkarev

เอาต์พุตที่เรียบง่ายและแม่นยำที่สุด
janpio

ดูเหมือนว่าจะทำงานได้ดีใน Win10
mivk

18

คุณสามารถโกงนิดหน่อยด้วยสคริปต์แบทช์ ...

@echo off
echo %time% < nul
cmd /c %1
echo %time% < nul

จากนั้นเรียกใช้โปรแกรมของคุณเป็นอาร์กิวเมนต์ของสคริปต์นี้ ...

ตัวจับเวลา myprogram.exe

และสำหรับข้อโต้แย้ง ...

ตัวจับเวลา "myprogram.exe -sw1 -sw2"

เอาท์พุทตัวอย่าง:

17:59:20.02
some text
17:59:20.03

วางสคริปต์ชุดหนึ่งในตัวแปรเส้นทางของคุณเช่นและชื่อC:\Windows\System32 timer.cmdแน่นอนว่ามันมีประสิทธิภาพเล็กน้อยในการฟอร์กอินสแตนซ์ cmd ที่สองแม้ว่าจะน้อยมาก


พรอมต์นั้นใช้ไม่ได้@echo off echo %time% < nul cmd /c %1 echo %time% < nul คุณออกจาก% การปิดในตัวแปรสภาพแวดล้อม (?)

ไม่มีการปิด% สำหรับพารามิเตอร์บรรทัดคำสั่งเช่น% 1 นั่นคือสิ่งที่คุณหมายถึงอะไร
Andrew J. Brehm

2
ทำไมคุณถึงเปลี่ยนเส้นทางnul ไป echo ? echoไม่เคยอ่านอินพุต
Joey

1
คุณสามารถเปลี่ยนcmd /c %1เป็นcmd /c %*เพื่อให้คุณสามารถบันทึกเครื่องหมายคำพูดสำหรับอาร์กิวเมนต์คำสั่ง
stanleyxu2005

3

ไม่มีเทียบเท่าโดยตรงกับ Unix timeบน Windows

University of Georgia มีรายการคำสั่งแบบย่อของWindows สำหรับผู้ใช้ Unix

ฉันพบว่าพรอมต์คำสั่ง Windows ที่เก่ากว่าและสคริปต์. bat ค่อนข้าง จำกัด เมื่อเทียบกับ Unix shells แต่มีสิ่งอำนวยความสะดวกบางอย่างสำหรับการวนลูปไฟล์ ฯลฯ CommandWindows.com มีเคล็ดลับ

คุณสามารถติดตั้งbashบน Windows (เช่นโดยการติดตั้ง CygWin) หรือเรียนรู้ Windows Powershell (ซึ่งฉันคิดว่ามีวิธีการทำสิ่งที่เทียบเท่า)


2

เอาต์พุตสำหรับโค้ดของคุณสามารถไพพ์ไปที่ไฟล์: java test <inputfile> | Out-File d:\a.txt

สำหรับการวัดว่าต้องใช้เวลานานแค่ไหนในการสรุปแคปเจอร์ใน Measure-Commmand:

Measure-Commmand {java test <inputfile> | Out-File d:\a.txt}


2

หากคุณพยายามใช้ PowerShell ด้วยเครื่องมือวัดคำสั่งโปรดระวังว่าอาจมี gotchas เกิดขึ้นบ้าง คำสั่งของฉันเขียนข้อมูลไบนารีไปยังไฟล์โดยใช้การ>เปลี่ยนเส้นทาง แต่ PowerShell เพิ่มBOMไปที่จุดเริ่มต้นของไฟล์และตัวแบ่งบรรทัด CRLF หลังจากการเขียนทุกครั้ง!


1

กาแฟบางอย่างช่วยฉันคิดเรื่องนี้:

function time { $Command = "$args"; Measure-Command { Invoke-Expression $Command 2>&1 | out-default} }

และถ้าคุณต้องการที่จะเอาท์พุทอะไรเพียงแค่แทนที่ด้วย out-null:

function timequiet { $Command = "$args"; Measure-Command { Invoke-Expression $Command 2>&1 | out-null} }

คุณใช้มันแบบนี้:

PS C:\> time sleep 5


Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 4
Milliseconds      : 990
Ticks             : 49906722
TotalDays         : 5,77624097222222E-05
TotalHours        : 0,00138629783333333
TotalMinutes      : 0,08317787
TotalSeconds      : 4,9906722
TotalMilliseconds : 4990,6722



PS C:\>

1

เพื่อความสะดวกในการใช้งานนี่คือแพ็คเกจช็อกโกแลต: https://chocolatey.org/packages/ptime C:/> choco install ptime

ข้อดีptimeคือถ้ามันทำหน้าที่เหมือนรุ่น unix และให้ผลผลิตคอนโซลเอาต์พุตซึ่งMeasure-Command { XXX }ไม่ได้ (หรืออย่างน้อยฉันก็ไม่รู้จะทำยังไง)


0

มีตัวเลือกที่แตกต่างกันสองสามตัวเพื่อรับคำสั่ง 'เวลา' การตั้งค่าของฉันคือติดตั้ง Cygwin (ซึ่งมาพร้อมกับtimeคำสั่งคล้าย UNIX )

หรือคุณสามารถเขียนสคริปต์และเพิ่มไปยังเส้นทางของคุณ (เพื่อให้คุณสามารถดำเนินการได้โดยไม่ต้องระบุเส้นทางทั้งหมด)

หากคุณมีPowershellให้ลองใช้สคริปต์นี้ (ใช้งานได้เมื่อเรียกไฟล์ - '. exe' ฯลฯ ):

$start = get-date
if ($args.length -gt 1) {
start-process $args[0] $args[1..$args.length] -workingdirectory $pwd -nonewwindow -wait
} else {
start-process $args[0] -workingdirectory $pwd -nonewwindow -wait
}
$end = get-date
$elapsed = $end - $start
write-host $end-$start
# datetime format
write-host $elapsed
# easy-to-read format
echo $elapsed

เรียกใช้รหัสด้วย (เช่น):

time.ps1 python program.py

การใช้ชุดผมขอแนะนำให้อย่างใดอย่างหนึ่งในคำตอบที่ชั้นนำจากที่นี่ (ใน Stackoverflow.com) ทั้งสองต้องถูกคัดลอกวาง โปรดทราบว่าหากคุณใช้โซลูชันของ paxdiabloคุณควรแทนที่

ping -n 11 127.0.0.1 >nul: 2>nul: 

กับ

%*

0

gnomonเป็นคำตอบที่ดีถ้าคุณไม่เพียงต้องการเวลารันโดยรวมของคำสั่งเท่านั้น แต่ยังรวมถึงการวัดเส้นด้วย:

ยูทิลิตีบรรทัดคำสั่งเพื่อเพิ่มข้อมูลเวลาประทับลงในเอาต์พุตมาตรฐานของคำสั่งอื่น มีประโยชน์สำหรับกระบวนการที่ใช้เวลายาวนานซึ่งคุณต้องการให้บันทึกประวัติของสิ่งที่ใช้เวลานาน

ติดตั้งโดยการทำงานแล้วก็ใช้งานได้ผ่านทางnpm install -g gnomoncommand | gnomon

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.