Другое событие NullPointerException
возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.
String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals
для гарантированного непустого объекта.
Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null
.
Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.
String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Вы упомянули clock()
и time()
- Вы искали gettimeofday()
? Это заполнит struct timeval
, который содержит секунды и микросекунды.
, Конечно, фактическое разрешение до аппаратных средств.
Если это имеет значение вот тот, который это - только некоторые макросы:
#include <time.h>
clock_t startm, stopm;
#define START if ( (startm = clock()) == -1) {printf("Error calling clock");exit(1);}
#define STOP if ( (stopm = clock()) == -1) {printf("Error calling clock");exit(1);}
#define PRINTTIME printf( "%6.3f seconds used by the processor.", ((double)stopm-startm)/CLOCKS_PER_SEC);
Тогда просто использование это с:
main() {
START;
// Do stuff you want to time
STOP;
PRINTTIME;
}
Вы хотите профилировщик приложение.
Поисковые ключевые слова в ТАК и поисковые системы: Linux, представляющий
Взгляните на gettimeofday, clock_ * , или get/setitimer.
Попробуйте "bench.h"; это позволяет Вам поместить START_TIMER; и STOP_TIMER ("имя"); в Ваш код, позволяя Вам произвольно сравнить любого раздела кода (примечание: только рекомендуемый для коротких разделов, не вещей, берущих десятки миллисекунд или больше). С точностью до такта, хотя в некоторых редких случаях это может измениться, как промежуточный код компилируется, в этом случае Вы более обеспечены с профилировщиком (хотя профилировщики обычно являются большим усилием использовать для определенных разделов кода).
Это только работает над x86.
Вы могли бы хотеть погуглить для инструментарий инструмент.
Вы не найдете вызов библиотеки, который позволяет Вам закончить разрешение часов своей платформы. Любое использование профилировщик (человек gprof) как другой плакат, предложенный, или - быстрый & грязный - помещает цикл вокруг незаконного раздела кода для выполнения его много раз, и часы использования ().
Если Вы разрабатываете на x86 или x64, почему бы не использовать Счетчик Метки времени: RDTSC.
Это будет более надежно затем Ansi C функции как время () или часы (), поскольку RDTSC является атомарной функцией. Используя функции C с этой целью может представить проблемы, поскольку у Вас нет гарантии, что поток, в котором они выполняются, не будет выключен, и в результате значение, которое они возвращают, не будет детальным описанием фактического времени выполнения, которое Вы пытаетесь измерить.
С RDTSC можно лучше измерить это. Необходимо будет преобразовать количество галочки назад в человекочитаемое время формат H:M:S, который будет зависеть от тактовой частоты процессоров, но Google вокруг и я уверен, что Вы найдете примеры.
однако даже с RDTSC Вы будете включать время, Ваш код был переключен из выполнения, в то время как лучшее решение, чем использование времени () / часы (), при необходимости в точном измерении, необходимо будет обратиться к профилировщику, который оснастит код и примет во внимание, когда код на самом деле не выполнится из-за контекстных переключений или что бы то ни было.
Это зависит от условий .. Профилировщики хороши для общих глобальных представлений, однако, если вам действительно нужно точное представление, я рекомендую KISS. Просто запустите код в цикле, чтобы его выполнение заняло около минуты. Затем вычислите простое среднее значение на основе общего времени выполнения и выполненных итераций.
Этот подход позволяет:
Получать точные результаты с помощью таймеров с низким разрешением.
Не сталкиваться с проблемами, когда приборы мешают работе высокоскоростных кэшей (l2, l1, ветвь… и т. Д.) Рядом с процессором. Однако выполнение того же кода в жестком цикле также может обеспечить оптимистичные результаты, которые могут не отражать реальных условий.