Apakah ada cara untuk menentukan berapa banyak waktu yang dibutuhkan suatu metode untuk dieksekusi (dalam milidetik)?
222
Apakah ada cara untuk menentukan berapa banyak waktu yang dibutuhkan suatu metode untuk dieksekusi (dalam milidetik)?
Jawaban:
Cepat:
Swift3:
Mudah digunakan dan memiliki presisi sub-milidetik.
sumber
NSLog(@"executionTime = %f", executionTime);
NSDate
danmach_absolute_time()
pada level sekitar 30 ms. 27 vs 29, 36 vs 39, 43 vs 45.NSDate
lebih mudah digunakan untuk saya dan hasilnya cukup mirip untuk tidak repotmach_absolute_time()
.Berikut adalah dua makro satu baris yang saya gunakan:
Gunakan seperti ini:
sumber
#define TOCK NSLog(@"%s Time: %f", __func__, -[startTime timeIntervalSinceNow])
membuat jawaban ini juga mengembalikan fungsi timer digunakan. Saya menemukan ini berguna jika saya menggunakan TICK TOCK untuk mengatur waktu beberapa fungsi.__PRETTY_FUNCTION__
dan__LINE__
jika Anda menginginkan informasi lebih rinci.Untuk pengaturan waktu halus pada OS X, Anda harus menggunakan yang
mach_absolute_time( )
dinyatakan dalam<mach/mach_time.h>
:Tentu saja peringatan biasa tentang pengukuran berbutir halus berlaku; Anda mungkin sebaiknya menjalankan rutin yang sedang diuji berkali-kali, dan rata-rata / mengambil minimum / beberapa bentuk pemrosesan lainnya.
Selain itu, harap perhatikan bahwa Anda mungkin merasa lebih berguna untuk membuat profil aplikasi Anda berjalan menggunakan alat seperti Shark. Ini tidak akan memberi Anda informasi waktu yang tepat, tetapi akan memberi tahu Anda berapa persen waktu aplikasi dihabiskan di mana, yang seringkali lebih bermanfaat (tetapi tidak selalu).
sumber
Ada pembungkus yang nyaman untuk
mach_absolute_time()
- ituCACurrentMediaTime()
fungsi.ObjC
Cepat
sumber
NSDate
.Di Swift, saya menggunakan:
Di Macros.swift saya, saya baru saja menambahkan
Anda sekarang dapat menelepon ke mana saja
sumber
\(-startTime.timeIntervalSinceNow)
(perhatikan yang negatif)Saya tahu ini sudah lama tetapi bahkan saya mendapati diri saya melewatinya lagi, jadi saya pikir saya akan menyerahkan pilihan saya sendiri di sini.
Taruhan terbaik adalah untuk memeriksa posting blog saya tentang ini: Mengatur waktu hal-hal di Objective-C: A stopwatch
Pada dasarnya, saya menulis sebuah kelas yang tidak berhenti menonton dengan cara yang sangat dasar tetapi dienkapsulasi sehingga Anda hanya perlu melakukan hal berikut:
Dan Anda berakhir dengan:
dalam log ...
Sekali lagi, lihat tulisan saya untuk lebih banyak atau unduh di sini: MMStopwatch.zip
sumber
Saya menggunakan makro berdasarkan solusi Ron .
Untuk baris kode:
kita akan melihat di konsol sesuatu seperti: TIME1: 0,096618
sumber
Saya menggunakan implementasi kelas yang sangat minimal, satu halaman yang terinspirasi oleh kode dari posting blog ini :
Penggunaannya sangat sederhana:
[DBGStopwatch start:@"slow-operation"];
di awal[DBGStopwatch stop:@"slow-operation"];
setelah selesai, untuk mendapatkan waktusumber
Anda bisa mendapatkan pengaturan waktu yang sangat baik (seconds.parts detik) menggunakan kelas StopWatch ini. Menggunakan pengatur waktu presisi tinggi di iPhone. Menggunakan NSDate hanya akan memberi Anda akurasi kedua. Versi ini dirancang khusus untuk autorelease dan objektif-c. Saya memiliki versi c ++ juga jika diperlukan. Anda dapat menemukan versi c ++ di sini .
StopWatch.h
StopWatch.m
Kelas memiliki
stopWatch
metode statis yang mengembalikan objek autoreleased.Setelah Anda menelepon
start
, gunakanseconds
metode untuk mendapatkan waktu yang telah berlalu. Panggilstart
lagi untuk memulai kembali. Ataustop
untuk menghentikannya. Anda masih dapat membaca waktu (panggilanseconds
) kapan saja setelah meneleponstop
.Contoh Dalam Fungsi ( Pengaturan waktu eksekusi)
sumber
Saya menggunakan kode ini:
sumber
Saya menggunakan ini:
Tapi saya tidak yakin tentang CLOCKS_PER_SEC di iPhone. Anda mungkin ingin meninggalkannya.
sumber
Contoh pengaturan waktu berbutir halus
mach_absolute_time()
dalam Swift 4:sumber
Oke, jika tujuan Anda adalah mencari tahu apa yang dapat Anda perbaiki untuk membuatnya lebih cepat, itu adalah tujuan yang sedikit berbeda. Mengukur waktu yang dibutuhkan fungsi adalah cara yang baik untuk mengetahui apakah apa yang Anda lakukan membuat perbedaan, tetapi untuk mengetahui apa yang harus dilakukan, Anda memerlukan teknik yang berbeda. Ini yang saya rekomendasikan , dan saya tahu Anda bisa melakukannya di iPhone.
Sunting: Peninjau menyarankan agar saya menguraikan jawabannya, jadi saya mencoba memikirkan cara singkat untuk mengatakannya.
Program keseluruhan Anda membutuhkan cukup waktu jam untuk mengganggu Anda. Misalkan N detik.
Anda mengasumsikan Anda dapat mempercepatnya. Satu-satunya cara Anda dapat melakukannya adalah dengan membuatnya tidak melakukan sesuatu yang dilakukannya pada waktu itu, akuntansi untuk m detik.
Anda awalnya tidak tahu benda apa itu. Anda bisa menebak, seperti yang dilakukan oleh semua programmer, tetapi bisa dengan mudah menjadi sesuatu yang lain. Apa pun itu, inilah cara Anda dapat menemukannya:
Karena benda itu, apa pun itu, menyumbang fraksi m / N pada saat itu, itu berarti jika Anda menjeda secara acak kemungkinannya adalah m / N bahwa Anda akan menangkapnya saat melakukan hal itu. Tentu saja itu mungkin melakukan sesuatu yang lain, tetapi berhenti sebentar dan lihat apa yang dilakukannya.
Sekarang lakukan lagi. Jika Anda melihatnya melakukan hal yang sama lagi, Anda bisa lebih curiga.
Lakukan 10 kali, atau 20. Sekarang jika Anda melihatnya melakukan hal tertentu (tidak peduli bagaimana Anda menggambarkannya) pada beberapa jeda, yang dapat Anda singkirkan, Anda tahu dua hal. Anda tahu kira-kira berapa lama waktu yang dibutuhkan, tetapi Anda tahu persis apa yang harus diperbaiki.
Jika Anda juga ingin tahu persis berapa banyak waktu yang akan dihemat, itu mudah. Ukur sebelum, perbaiki, dan ukur sesudahnya. Jika Anda benar-benar kecewa, mundurlah perbaiki.
Apakah Anda melihat bagaimana ini berbeda dari mengukur? Itu menemukan, bukan mengukur . Kebanyakan profiling didasarkan pada pengukuran setepat mungkin berapa banyak waktu yang diambil, seolah-olah itu penting, dan menggerakkan tangan masalah mengidentifikasi apa yang perlu diperbaiki. Profil tidak menemukan setiap masalah, tetapi metode ini memang menemukan setiap masalah, dan masalah yang menurut Anda tidak menyakiti Anda.
sumber
Berikut cara lain, di Swift, untuk melakukannya menggunakan kata kunci penangguhan
Dari dokumen Apple : Pernyataan penundaan digunakan untuk mengeksekusi kode tepat sebelum mentransfer kontrol program di luar ruang lingkup di mana pernyataan penundaan muncul.
Ini mirip dengan blok coba / akhirnya dengan keuntungan memiliki kode terkait yang dikelompokkan.
sumber
Saya menggunakan ini di perpustakaan utils saya ( Swift 4.2 ):
... lalu panggil dengan metode seperti:
... yang pada gilirannya terlihat seperti ini di konsol setelah dijalankan:
Tidak sesingkat TICK / TOCK di atas, tetapi cukup jelas untuk melihat apa yang dilakukannya dan secara otomatis mencakup apa yang sedang dihitung waktunya (berdasarkan file, baris pada awal metode, dan nama fungsi). Jelas jika saya ingin lebih detail (mis., Jika saya tidak hanya menghitung waktu pemanggilan metode seperti kasus biasa tetapi saya menghitung waktu blok dalam metode itu) Saya dapat menambahkan parameter "name =" Foo "" pada init PrintTimer menamakannya sesuatu selain default.
sumber
Karena Anda ingin mengoptimalkan waktu bergerak dari satu halaman ke halaman lain di UIWebView, bukankah itu berarti Anda benar-benar ingin mengoptimalkan Javascript yang digunakan dalam memuat halaman-halaman ini?
Untuk itu, saya akan melihat profiler WebKit seperti yang dibicarakan di sini:
http://www.alertdebugging.com/2009/04/29/building-a-better-javascript-profiler-with-webkit/
Pendekatan lain adalah memulai pada level tinggi, dan pikirkan bagaimana Anda dapat mendesain halaman web yang dimaksud untuk meminimalkan waktu pemuatan menggunakan pemuatan halaman gaya AJAX alih-alih menyegarkan seluruh tampilan web setiap kali.
sumber
sumber
Inilah solusi Swift 3 untuk membagi dua kode di mana saja untuk menemukan proses yang berjalan lama.
Penggunaan: -
Output sampel: -
sumber
banyak jawaban yang aneh dan tidak benar-benar memberikan hasil dalam milidetik (tetapi dalam detik atau apa pun):
di sini apa yang saya gunakan untuk mendapatkan MS (MILLISECONDS):
Cepat:
Tujuan-C:
sumber
Untuk Swift 4, tambahkan sebagai Delegasi ke kelas Anda:
Tambahkan ke kelas kami:
Kemudian tambahkan ke kelas Anda:
Ketika Anda ingin mengatur waktu sesuatu, mulailah dengan:
Dan diakhiri dengan:
sumber