Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
Современные технологии Just-In-Time и HotSpot дают некоторую уверенность, что вычислительный Java-код, интенсивно работающий с числами и массивами чисел, скорее всего не будет отставать по скорости от языка C в 10-100 раз – как это было на заре развития Java. Но отставание в полтора-два и даже в несколько раз вполне возможно. Опережение же – весьма маловероятно.
Приведем пример. Даны 2 массива a и b коротких целых чисел (short) длины 20000. Требуется для каждой пары соответствующих элементов вычислить минимум и поместить его в массив a: a[k]= a[k]<b[k]? a[k]: b[k].
Решаем задачу на чистой Java и с применением native-кода на языке C. В обоих случаях цикл «расцикливаем», чтобы по возможности исключить потери на инкремент индекса. Для Java «расцикленное» оптимальное решение выглядит примерно так:
for (; aofs<aofsmax; aofs+=4,bofs+=4) {
if (a[aofs]>b[bofs]) a[aofs]=b[bofs];
if (a[aofs+1]>b[bofs+1]) a[aofs+1]=b[bofs+1];
if (a[aofs+2]>b[bofs+2]) a[aofs+2]=b[bofs+2];
if (a[aofs+3]>b[bofs+3]) a[aofs+3]=b[bofs+3];
}
Измерения быстродействия на компьютере Pentium-III 800 МГц с кэшем процессора 256 Кб показывают: если оба массива попадают в кэш процессора, то цикл на Java расходует 11.5 наносекунд на элемент, а на C++ – всего 6 наносекунд. (Использовался комплект Sun Java SDK 1.4.1 и компилятор Microsoft C++ из пакета Visual Studio 6.0, операционная система Windows 2000.) Если применить встроенный ассемблер C++ и специальные команды MMX/SSE, то время можно сократить до 1.4 наносекунды на элемент – в 8 раз быстрее чем наилучшее время в Java.
Если массивы существенно длиннее и не помещаются в кэш процессора, то разница между Java, C и ассемблером будет меньше: 25нс на Java, 19нс на С и 12нс на ассемблере с использованием команд MMX/SSE. (Все эти цифры, разумеется, чисто ориентировочные – на разных компьютерах возможны заметные отличия.)
Вопрос:
Как измерить промежуток времени, затраченный, например, на выполнение некоторого участка программы?
Ответ: