Как зарегистрировать время выполнения метода точно в миллисекундах?

Существует ли способ определить, сколько времени метод должен выполниться (в миллисекундах)?

215
задан Kara 27 January 2014 в 12:38
поделиться

5 ответов

NSDate *methodStart = [NSDate date];

/* ... Do whatever you need to do ... */

NSDate *methodFinish = [NSDate date];
NSTimeInterval executionTime = [methodFinish timeIntervalSinceDate:methodStart];
NSLog(@"executionTime = %f", executionTime);

Swift:

let methodStart = NSDate()

/* ... Do whatever you need to do ... */

let methodFinish = NSDate()
let executionTime = methodFinish.timeIntervalSinceDate(methodStart)
print("Execution time: \(executionTime)")

Swift3:

let methodStart = Date()

/* ... Do whatever you need to do ... */

let methodFinish = Date()
let executionTime = methodFinish.timeIntervalSince(methodStart)
print("Execution time: \(executionTime)")

Прост в использовании и имеет субмиллисекундную точность.

425
ответ дан 23 November 2019 в 04:19
поделиться

Поскольку вы хотите оптимизировать время, перемещаясь с одной страницы к другому в UIWEBVIEW, не означает, что вы действительно хотите оптимизировать JavaScript, используемый в загрузке этих страниц?

к этому концу, я бы посмотрел на WebKit Profiler, как разго говорилось здесь:

http://www.alertdebugging.com/2009/04/29/building-a-better-javascript-profiler-with-webkit/

Другой подход будет начать На высоком уровне и подумайте, как вы можете разработать вопросы веб-страниц, чтобы минимизировать время загрузки, используя нагрузку страницы страницы стиля AJAX, а не обновляя целый WebView каждый раз.

-1
ответ дан 23 November 2019 в 04:19
поделиться

Я использую это:

clock_t start, end;
double elapsed;
start = clock();

//Start code to time

//End code to time

end = clock();
elapsed = ((double) (end - start)) / CLOCKS_PER_SEC;
NSLog(@"Time: %f",elapsed);

Но я не уверен в Clocks_Per_sec на iPhone. Возможно, вы захотите оставить это.

2
ответ дан 23 November 2019 в 04:19
поделиться

Хорошо, если ваша цель - выяснить, что вы можете исправить, чтобы сделать его быстрее, это немного разная цель. Измерение времени, когда функции берут, это хороший способ узнать, если вы сделали разницу, но к Узнайте, что делать Вам нужна другая техника. Это то, что я рекомендую , и я знаю, что вы можете сделать это на iPhone.

Редактировать: рецензенты предполагали, что я разработал ответ, поэтому я пытаюсь подумать о кратком образе, чтобы сказать это.
Ваша общая программа принимает достаточно времени, чтобы беспокоить вас. Предположим, что это N секунды.
Вы предполагаете, что вы можете ускорить его. Единственный способ сделать это, чтобы сделать его не чем-то, что он делает в то время, учитывая м секунд.
Вы не знаете, что такое так. Вы можете догадаться, поскольку все программисты делают, но это легко может быть что-то еще. Что бы это ни было, вот как вы можете найти это:

С такой вещи, как бы то ни было, с учетом фракции м / н. времени, что означает, что если вы приоритете его случайным образом, вероятность M / N , что вы поймаете его в акте выполнения этой вещи. Конечно, это может сделать что-то еще, но приостановить это и посмотреть, что это делает.
Теперь сделайте это снова. Если вы видите, что это то же самое снова, вы можете быть более подозрительным.

Сделайте это 10 раз, или 20. Теперь, если вы видите, что это делает какую-то особенность (независимо от того, как вы его описываете) на нескольких паузах, что вы можете избавиться от двух вещей. Вы знаете очень примерно, какую долю времени требуется, но вы знаете очень точно Что исправить.
Если вы также хотите знать очень точно , сколько времени будет сохранено, это легко. Измерьте его раньше, исправьте его и измерите его после. Если вы действительно разочарованы, верните исправление.

Видите ли вы, как это отличается от измерения? Это находки, не измерения . Большинство профилирование основано на измерении как можно точнее, сколько времени принимается, как если бы это важно, и ручные волны проблема выявления того, что необходимо исправить. Профилирование не находит каждую проблему, но этот метод находит каждую проблему, и это проблемы, которые вы не обнаружите, что причиняют вам боль.

2
ответ дан 23 November 2019 в 04:19
поделиться

я думаю, что

if IsNotNull(value) {

эквивалентно

if not value:

для последовательностей. поэтому я думаю, что функция не нужна у питона.

-121--3464987-

Это не должно выполняться в функции. Вместо этого следует использовать:

if someStringOrNone:
-121--3464984-

Для точного синхронизации в OS X следует использовать mach _ absolute _ time () , объявленный в < mach/mach _ time.h > :

#include <mach/mach_time.h>
#include <stdint.h>

// Do some stuff to setup for timing
const uint64_t startTime = mach_absolute_time();
// Do some stuff that you want to time
const uint64_t endTime = mach_absolute_time();

// Time elapsed in Mach time units.
const uint64_t elapsedMTU = endTime - startTime;

// Get information for converting from MTU to nanoseconds
mach_timebase_info_data_t info;
if (mach_timebase_info(&info))
   handleErrorConditionIfYoureBeingCareful();

// Get elapsed time in nanoseconds:
const double elapsedNS = (double)elapsedMTU * (double)info.numer / (double)info.denom;

вы, вероятно, лучше всего вызвать процедуру в тесте много раз, и усреднить/принять минимум/некоторые другие формы обработки.

Кроме того, обратите внимание на то, что вам может быть полезнее профилировать приложение с помощью такого инструмента, как Shark. Это не даст точной информации о времени, но покажет, какой процент времени приложения тратится где, что часто более полезно (но не всегда).

48
ответ дан 23 November 2019 в 04:19
поделиться