Kecuali jika fungsi Anda sangat lambat, Anda memerlukan pengatur waktu dengan resolusi sangat tinggi. Yang paling akurat yang saya tahu adalah QueryPerformanceCounter
. Google itu untuk info lebih lanjut. Coba dorong perintah berikut ke dalam kelas, sebut saja CTimer
, lalu Anda dapat membuat instance di suatu tempat secara global dan cukup panggil .StartCounter
dan.TimeElapsed
Option Explicit
Private Type LARGE_INTEGER
lowpart As Long
highpart As Long
End Type
Private Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As LARGE_INTEGER) As Long
Private Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As LARGE_INTEGER) As Long
Private m_CounterStart As LARGE_INTEGER
Private m_CounterEnd As LARGE_INTEGER
Private m_crFrequency As Double
Private Const TWO_32 = 4294967296# ' = 256# * 256# * 256# * 256#
Private Function LI2Double(LI As LARGE_INTEGER) As Double
Dim Low As Double
Low = LI.lowpart
If Low < 0 Then
Low = Low + TWO_32
End If
LI2Double = LI.highpart * TWO_32 + Low
End Function
Private Sub Class_Initialize()
Dim PerfFrequency As LARGE_INTEGER
QueryPerformanceFrequency PerfFrequency
m_crFrequency = LI2Double(PerfFrequency)
End Sub
Public Sub StartCounter()
QueryPerformanceCounter m_CounterStart
End Sub
Property Get TimeElapsed() As Double
Dim crStart As Double
Dim crStop As Double
QueryPerformanceCounter m_CounterEnd
crStart = LI2Double(m_CounterStart)
crStop = LI2Double(m_CounterEnd)
TimeElapsed = 1000# * (crStop - crStart) / m_crFrequency
End Property
TimeElapsed()
memberikan hasilnya dalam milidetik. Saya tidak menerapkan kompensasi overhead apa pun karena saya lebih khawatir tentang efek gagap dalam perhitungan overhead daripada akurasi yang sempurna.GetTickCount
dari kernel32).StartCounter
AndTimeElapsed
? Saya melakukan Timer contohCTimer
di awal danWith StartCounter
saya hanya menulis.StartCounter
setelah sub saya mulai dan.TimeElapsed
dan itu menjawab sayaInvalid use of property
. Ketika saya biarkan.StartCounter
saja itu memberi tahu saya sebuah objek tidak disetel.Declare PtrSafe Function
stackoverflow.com/questions/21611744/…Fungsi Timer di VBA memberi Anda jumlah detik yang berlalu sejak tengah malam, hingga 1/100 detik.
sumber
Jika Anda mencoba mengembalikan waktu seperti stopwatch, Anda dapat menggunakan API berikut yang mengembalikan waktu dalam milidetik sejak sistem dimulai:
setelah http://www.pcreview.co.uk/forums/grab-time-milliseconds-included-vba-t994765.html (karena timeGetTime di winmm.dll tidak berfungsi untuk saya dan QueryPerformanceCounter terlalu rumit untuk tugas yang diperlukan)
sumber
Public Declare Function ...
bagiannya? Ini menciptakan kesalahan saat menambahkan kode Anda di bagian bawah sayaUntuk lebah baru, tautan ini menjelaskan cara melakukan pembuatan profil otomatis dari semua kapal selam yang ingin Anda pantau waktu:
http://www.nullskull.com/a/1602/profiling-and-optimizing-vba.aspx
http://sites.mcpher.com/share/Home/excelquirks/optimizationlink lihat procProfiler.zip di http://sites.mcpher.com/share/Home/excelquirks/downlable-items
sumber
Keluaran:
sumber
Kami telah menggunakan solusi berdasarkan timeGetTime di winmm.dll untuk akurasi milidetik selama bertahun-tahun. Lihat http://www.aboutvb.de/kom/artikel/komstopwatch.htm
Artikelnya dalam bahasa Jerman, tetapi kode dalam unduhan (kelas VBA yang membungkus panggilan fungsi dll) cukup sederhana untuk digunakan dan dipahami tanpa bisa membaca artikel.
sumber
Detik dengan 2 spasi desimal:
Milidetik:
Milidetik dengan pemisah koma:
Tinggalkan ini di sini untuk siapa saja yang mencari pengatur waktu sederhana yang diformat dengan detik hingga 2 spasi desimal seperti saya. Ini adalah timer kecil yang pendek dan manis yang suka saya gunakan. Mereka hanya mengambil satu baris kode di awal sub atau fungsi dan satu baris kode lagi di akhir. Ini tidak dimaksudkan untuk menjadi sangat akurat, saya biasanya tidak peduli tentang apa pun yang kurang dari 1/100 detik secara pribadi, tetapi pengatur waktu milidetik akan memberi Anda waktu berjalan paling akurat dari 3 ini. Saya juga telah membaca Anda bisa mendapatkan pembacaan yang salah jika kebetulan berjalan saat melintasi tengah malam, hal yang jarang terjadi tetapi hanya FYI.
sumber