Старая пословица говорит, что все познается в сравнении. Легко сравнить визуально две вещи, чтобы определить, какая красивее. Так же легко взять их в руки, чтобы понять, какая удобнее. Удобны для сопоставления величины из осязаемого мира, такие как масса, скорость, цена, расстояние, мощность. А вот с электронной техникой все сложнее.
Ее характеристики выражают в значениях из привычного нам физического мира (число транзисторов, количество ядер, их частота, объемы памяти), но напрямую на возможности конкретного устройства эти цифры не указывают. Для того, чтобы оценить их – были придуманы бенчмарки.
Бенчмарк – это специальная тестовая программа, которая имитирует задачи, которые электронике приходится выполнять в реальности, оценивает качество и скорость их выполнения, и по итогам теста присваивает баллы. Сравнивая эти баллы, можно сопоставить и сравнить два устройства, определить, какое лучше. Предметом оценки могут быть практическая скорость вычислений центрального (ЦП) или графического (ГП) процессора в различных задачах, уровень автономности, быстродействие памяти, или же комплексная оценка совокупности параметров.
Что такое бенчмарк (benchmark) и для чего он нужен?
Бенчмарки для оценки производительности ЦП
Бенчмарки для оценки производительности процессора нагружают ядра ЦП чисто теоретической вычислительной задачей (например, решением систем линейных уравнений), или же симулируют практические сценарии (например, обработку веб-страниц). По итогам оценки скорости решения задач присваиваются очки. В первом случае это обычно абсолютные показатели ФЛОПС (количество вычислений с плавающей запятой в секунду). Во втором используются более абстрактные значения (прозванные в народе попугаями – по аналогии с мультфильмом, в которому длину удава измеряли попугаем), такие как количество обработанных за тестовый промежуток страниц, объем заархивированных данных, перекодированного аудио или видео, и т.д.
Популярным тестом процессора для смартфонов является GeekBench. Этот бенчмарк оценивает скорость шифрования данных, архивации, обработки изображений, запросов SQL, HTML-кода, рендеринга различных документов, а также скорость работы памяти и ее контроллера. На основании суммарной оценки присваивается итоговый балл. Особенностью теста является его кроссплатформенность и практическая ориентированность (работа не с абстрактными уравнениями, а реальными сценариями). В GeekBench можно сравнить между собой результаты смартфона на ARM процессоре Qualcomm, MTK или Apple, x86-64 ПК на базе AMD или планшета на Intel Atom, и сравнение можно считать объективным.
Бенчмарки для оценки производительности ГП
Оценка быстродействия процессора – это хорошо, но узнать возможности графики интересно большему числу людей. Ведь с веб-серфингом сейчас справляется и четверка ядер Cortex A53 в бюджетном китайце, а вот самым тяжелым видом программ являются игры. Для теста производительности графики бенчмарк запускает ренедеринг определенной трехмерной сцены, имитирующей игровую ситуацию. По итогам теста за производительность ГП присваиваются абстрактные баллы, или же выводится суммарный FPS (количество кадров в секунду) за определенный промежуток времени. Чем больше кадров смог обработать ГП – тем больше баллов присвоит ему бенчмарк.
ANTUTU BENCHMARK УДАЛЕН ИЗ GOOGLE PLAY! ЧТО СЛУЧИЛОСЬ И ЧТО ДЕЛАТЬ?
Пример бенчмарка, осуществляющего тест скорости графики – 3DMark. Мобильная версия этой программы отличается от компьютерной своей спецификой, но для оценки ГП и сравнения разных смартфонов он подходит. Бенчмарк осуществляет тестирование производительности графики в режимах OpenGL, версий 2.0-3.1. Еще один тест графики – GFXBench. Он оценивает быстродействие графического процессора смартфона методом рендеринга набора трехмерных роликов, имитирующих различные виды игр (гонки, стрелялки и т.д.).
Бенчмарки для теста автономности
Значение емкости батареи, измеренное в мАч или Втч, не дает представления о практической автономности устройства. Сравнивать разные смартфоны по живучести позволяют бенчмарки для теста батареи. Эти программы создают нагрузку на батарею, имитируя реальные сценарии, такие как проигрывание видео и музыки, обработку веб-страниц, офисных документов, игровую и вычислительную нагрузку процессора.
Результат тестирования батареи выражается или в абстрактных баллах, или в часах и минутах. По первому принципу работает тест AnTuTu Battery Test. Он нагружает смартфон различными задачами и определяет, за какой промежуток батарея разрядится на N процентов. Чем он больше – тем выше и баллы. PCMark Battery Test выдает результат не в баллах, а указывает время, которое смартфон способен проработать при определенном сценарии нагрузок смешанного типа, нагружающих смартфон.
Комплексные бенчмарки
Комплексные бенчмарки – наиболее популярная разновидность тестов для смартфонов. Эти программы оценивают вычислительную мощность ЦП и ГП, скорость оперативной и постоянной памяти, общее быстродействие в определенных задачах. По итогам тестирования смартфону присваиваются баллы, их расчет каждая программа осуществляет по своему алгоритму.
Самый популярный комплексный бенчмарк, AnTuTu, суммирует очки, которые набрал в тестах графики, процессора и общей производительности. Он производит отрисовку двух 3D-роликов для оценки графики, нагружает ЦП математическими, общими задачами, а также проводит многоядерный тест. По общей производительности баллы присваиваются за результаты обработки шифрования, кодирования данных, обработку изображений, и других сценариев. Результат AnTuTu – это суммарный балл по всем тестам.
Схожие принципы использует другой комплексный бечмарк, Quadrant. В нем баллы тоже суммируются по итогам тестов разных частей аппаратного обеспечения. То же самое можно сказать про Basemark, Vellamo и другие, менее популярные программы для тестирования смартфона.
Источник: mobcompany.info
Что такое бенчмарк?
Читая новости и всевозможные статьи, вы, наверняка, не раз натыкались на данные, показанные бенчмарками. Но что же это за приложения? Что именно они измеряют, важны ли показанные ими результаты? Давайте постараемся ответить на эти вопросы.
Первый бенчмарк появился, как можно догадаться, не на смартфоне. Изначально подобную программу устанавливали только владельцы компьютеров. Производительность тестировалась посредством 3Dmark и некоторых других приложений. Лишь много позже разработчики стали создавать бенчмарки специально для мобильных операционных систем. Сейчас существует достаточно большое количество таких утилит, в чём вы можете убедиться, прочитав материал о лучших бенчмарках для Android.
Чем занимается бенчмарк?
Любой современный смартфон состоит из множества компонентов. Одни обеспечивают какой-то определенный функционал. Например, сканер отпечатков пальцев улучшает безопасность, не позволяя разблокировать ваше устройство другим людям. Ну а аудиопроцессор улучшает звучание музыки, когда вы подключаете высококачественную гарнитуру.
Другие компоненты влияют на производительность девайса. В частности, это касается процессора, оперативной памяти и некоторых других комплектующих. Мощность именно таких компонентов измеряет бенчмарк для смартфонов.
Пример результата тестирования Samsung Galaxy A5 2016
Подобное приложение проводит разнообразные тесты. Каждый из них заточен под определенные возможности комплектующих. Например, Антуту, если упрощать, проводит тестирование в три этапа:
- Приложение начинает свою работу с непрерывного потока данных, проверяя тем самым производительность оперативной памяти;
- Затем программа заполняет экран множеством двухмерных фигур — так проверяется то, как установленный процессор справляется с обработкой 2D-графики;
- В конце же AnTuTu Benchmark выводит на экран последовательность трехмерных изображений, тем самым проверяя работоспособность графического ускорителя.
Мы неспроста в качестве примера назвали AnTuTu. Сейчас это приложение считается золотым стандартом в мире мобильных бенчмарков — именно на его данные ориентируются многие пользователи и производители смартфонов.
Разнообразие комплектующих
Многие люди считают, что мобильные устройства наделяются одинаковыми комплектующими. Отличается, например, лишь объем оперативной памяти. Или же, например, тактовая частота процессора. Но на самом деле все эти компоненты производятся разными компаниями, в связи с чем их характеристики могут быть совершенно разными. Из-за этого производительность устройств сильно отличается.
Оперативная память. Конечно, наиболее важным её параметром является объем. Но отличается у памяти и пропускная способность. Этот параметр не пишут в характеристиках устройства. Выяснить, насколько высокой скоростью обладает память, можно только посредством запуска бенчмарка.
Скоростная оперативная память быстрее вбирает в себя информацию, быстрее она затем и считывается. В результате приложения грузятся быстро, как и сама операционная система. Если же оперативная память медленная, то вы обязательно будете сталкиваться с подтормаживаниями Android.
Процессор. Это самый технически сложный компонент. В первую очередь люди обращают внимание на количество ядер, из которых он состоит, и тактовую частоту. Но на самом деле суммарная мощность зависит и от технологии изготовления, и от многих других факторов.
А ещё именно от процессора зависит наличие поддержки тех или иных технологий, касающихся сетей четвертого поколения. К слову говоря, именно на показания бенчмарков мы ориентировались при создании рейтинга самых мощных процессоров.
Постоянная память. От её объёма производительность практически никак не зависит. Но такой тип памяти тоже обладает той или иной скоростью записи и чтения. От этого тоже зависит то, как быстро операционная система получит доступ к тем или иным данным.
Остальные комплектующие. Они на результаты смартфонов почти никак не влияют. Однако при помощи бенчмарка вы всё же сможете хотя бы ради интереса узнать, из каких компонентов состоит ваш телефон. Например, так вы выясните, имеет ли аппарат гироскоп. Если такой датчик отсутствует, то нет никакого смысла покупать VR-шлем.
Расскажет бенчмарк и о беспроводных модулях, и об экране (за исключением его диагонали), и о многом другом.
Доверяй, но проверяй
Все бенчмарки позволяют лишь примерно сравнивать один смартфон с другим. Дело в том, что иногда тест производительности совершенно ни о чём не говорит. Некоторые производители адаптируют «железо» таким образом, чтобы оно выдавало великолепные результаты в AnTuTu и других бенчмарках. Но в реальной жизни такой аппарат может вести себя крайне неадекватно. Вот почему перед покупкой смартфона следует почитать обзоры на него, не ориентируясь только на цифры, показанные в бенчмарке.
Разнообразие бенчмарков в Google Play
Также следует заметить, что тест производительности выжимает из устройства все соки. В обычной жизни девайс не будет повышать тактовую частоту процессора до экстремальных значений, ведь это приведёт к молниеносной разрядке аккумулятора. Да и на оперативную память чаще всего накладываются определенные ограничения. Это ещё одна причина более медленной работы устройства вне его тестирования бенчмарком.
Где посмотреть результаты?
Скачать любой бенчмарк можно в Google Play или AppStore. После тестирования вы увидите табличку с результатами вашего смартфона. Также вы сможете узнать, какие устройства показали чуть более лучший и худший результат. В некоторых приложениях реализована система авторизации. В таком случае сервис будет хранить информацию о всех смартфонах и планшетах, которые были вами протестированы.
Если говорить именно об AnTuTu, то у этого бенчмарка есть собственный официальный сайт. На нём вы найдете актуальный рейтинг смартфонов, обновляющийся каждый месяц. Например, по итогам марта 2017 года самым мощным аппаратом является iPhone 7 Plus. При этом в плане 3D-графики его чуть-чуть обходят OnePlus 3T, LeEco Le Pro 3 и Moto Z.
Источник: setphone.ru
Benchmarking. Введение для начинающих
С таким понятием, как измерение производительности рано или поздно сталкивается, наверное, абсолютно каждый программист.
В любой конторе, в любом коллективе, да даже, когда вы наедине со своим Тайлером Дерденом (но только, если ваш Тайлер — программист), обязательно, хотя бы раз, зайдет спор о том, как реализовать ту или иную функцию, чтобы она работала быстро. Но быстро, как характеристика обычно не котируется, поэтому предлагаю поговорить о том, как абстрактное быстро превращать в неабстрактное число.
Инструментарий
Замерять производительность можно разными инструментами, давайте поговорим о некоторых из тех, с которыми мне приходилось сталкиваться.
Date
Нативная структура данных описывающая дату/время.
Все замеры сводятся к тому, что мы замеряем дату перед функцией, затем дату после функции, и берем разницу.
Стоит ли говорить, что ни о какой избыточной точности таких замеров не может идти речи из-за особенности хранения даты в ОС.
Системные часы инициализируются от аппаратных при загрузке операционной системы, и далее системное время поддерживаются с помощью регулярных прерываний от таймера. (Wikipedia)
Если говорить проще, то время кэшируется и обновляется с определенной частотой, и точность наших замеров не может превышать частоту этого обновления.
Единственный случай, где Date может пригодиться, это если вы заменяете скрипты, которые выполняются по несколько секунд, и разница в ± 100 мс для вас не играет никакой роли. Я вообще не рекомендую пользоваться Date для замеров.
Performance.now()
Возвращает временную метку измеряемую в миллисекундах с точностью до одной тысячной миллисекунды.
Для Node.js измерение идет с отсчетом от начала выполнения текущего потока выполнения, а для браузеров от события PerformanceTiming.navigationStart.
Замер времени выполнения функции выглядит вот так:
const start = performance.now(); myAwesomeFunc(); const end = performance.now(); // Переводим в секунды const diffSec = (end — start) / 1000; // Выводим кол-во выполнений в секунду. console.log(‘op/sec: ‘ + (1 / diffSec);
Мне приятнее сравнивать числа в формате op/sec, нежели в виде 0.00000546654.
Performance.now() не только точнее чем Date, но и куда удобнее. Вам не придется проводить каких-либо дополнительных манипуляций с переводом даты в timestamp и обратно, вы сразу получаете число в удобных единицах измерения.
Benchmark.js
Библиотека для точных измерений работы кода и сбора статистики выполнения. На мой взгляд она несколько тяжела для быстрого вникания, но предоставляет весь необходимый набор инструментов для замера производительности кода.
var suite = new Benchmark.Suite; // add tests suite.add(‘RegExp#test’, function() < /o/.test(‘Hello World!’); >) .add(‘String#indexOf’, function() < ‘Hello World!’.indexOf(‘o’) >-1; >) .add(‘String#match’, function() < !!’Hello World!’.match(/o/); >) // add listeners .on(‘cycle’, function(event) < console.log(String(event.target)); >) .on(‘complete’, function() < console.log(‘Fastest is ‘ + this.filter(‘fastest’).map(‘name’)); >) // running .run();
Benchmark.js довольно гибко позволяет писать тесты. Я вообще использую их в связке с mocha, чтобы их можно было удобно запускать в нужных папках, не запуская при этом ненужные.
Распространенные Ошибки
Замеры производительности только кажутся простым делом. На самом деле есть много подводных камней, которые могут испортить вам всю малину: от компилятора и самого js, до операционной системы.
Оптимизация компилятора
Ошибка характерная только для микробенчмарков и можно ее выразить во фразе:
Хочешь рассмешить компилятор — покажи ему микробенчмарки, которые собираешься сделать.
Давайте посмотрим на функцию для измерения цены получения значения длинны массива.
Функция для замера
function checkLen(array: number[]) < let len = 0; for (let i = 0; i< 1_000_000; i++) < len = array.length; >return len; >
Результат*: 720.4278 op/sec
*- Этот и все нижеприведенные результаты являются средним значением для тысячи вызовов.
Это количество вызовов функции за секунду, если вас интересует результат по получении поля то надо это время домножить на миллион.
Нельзя сказать, что это плохой вариант замера, мы миллион раз обращаемся к полю, а потом итоговое время выполнения функции умножаем на этот самый миллион и получаем итоговое количество операций в секунду.
На самом деле в итоговом значении еще учитывается стоимость вызова функции и стоимость итерации, но это, пожалуй, мелочи.
Так вот, казалось бы в чем проблема Hrodvitnir? А в том, что это все наглая ложь и не правда. Давайте-ка, запустим вот эту функцию:
function checkLen(array: number[]) < let len = 0; len = array.length; for (let i = 0; i< 1_000_000; i++) < >return len; >
Результат: 718.3247 op/sec
А теперь внимание вопрос: мы один раз обратились к полю и выполнили на две операции в секунду меньше.
Ну давайте честно: две операции разницы это разница в 0.28%, и мы можем этим смело пренебречь, и считать оба этих результата эквивалентными. А вот это, в свою очередь должно нас озаботить.
Дело в том, что этот способ замерять время обращения к полю уже устарел. И устарел он примерно тогда же, когда js перестал быть интерпретируемым.
Компилятор просто-напросто превращает код из первого примера во второй. Происходит это, потому что код внутри цикла не имеет абсолютно никаких побочных эффектов, и может быть перемещен в область вне цикла, тем самым снизив стоимость итерации. Получается компилятор сломал нам бенчмарк.
И это не единственный вариант, как такое может произойти.
Компилятор умеет манипулировать кодом в циклах, умеет встраивать функции, и т. д. Конкретно эта оптимизация называется LICM.
Вместо этого, мы можем проверить обращение к полю вот так:
function checkLen( array: number[], len: number[] // массив на 1000000 элементов ) < for (let i = 0; i< 1_000_000; i++) < len[i] = array.length; >return len; >
Результат: 330.0807
Результат получился в два раза меньше, чем первый, что, наверное, уже больше похоже на правду, хотя здесь идет искажние, за счет того, что мы записываем цисло не в переменную, а в массив, хотя не думаю, что оно сильное.
Но давайте честно, замерять скорость получения длинны массива занятие абсолютно неблагодарное.
Пример здесь приведен сугубо для того, чтобы продемонстрировать, что может быть и такая ситуация.
Замер одних и тех же данных
Это та ошибка, которая водила меня некоторое время за нос.
В качестве аргумента выступает массив от 1 до 1,000,000.
const testArray = _.range(1, 1_000_000).toArray(); // Массив со значениями от 1 до 1,000,000
Ниже приведен метод из моей библиотеки, которым мы отфильтровываем все нечетные значения:
function checkFilter(array: number[]) < return _(array).where(item =>!!(item % 2)).toArray() >
Результат: 23.4559
В общем-то, неплохо, быстрее даже чем нативный filter и быстрее, чем lodash.
Мы с вами, даже это проверили в статье Нативный — не значит быстрый
Но если мы замерим эту функцию на еще раз на неотсортированном массиве, то получим уже вот такой результат:
Результат: 13.3961
На неотсортированном массиве фильтрация идет в два раза дольше. При чем и у меня, и у lodash, и у нативной реализации.
А казалось, всего-то проверили на другом массиве.
Однократный замер
Давайте снова обратимся к замеру отсортированного массива из предыдущего примера и сделаем несколько разовых замеров:
1 | 30 | 30 |
2 | 27 | 28.5 |
3 | 18 | 25 |
4 | 24 | 24.75 |
5 | 13 | 22.4 |
Как видите, первый замер отличается от последнего более чем в два раза, при этом среднее неумолимо отклоняется от первой строчки.
Давайте отметим, это не 10 замеров подряд, это 10 запусков скрипта с одним замером.
Разница так велика, банально, оттого, что замеры происходят при разной загрузке ЦП.
Кроме того, мы замеряем не боевую функцию, а «холодную», ту, что выполняется интерпретируемо, а не ту, что уже скомпилирована в байт-код. В общем, все говорит о том, что разовые замеры не говорят ни чего о том, как эта функция будет вести себя в бою.
Замер в разных условиях
Эта ошибка косвенно связана с предыдущей: делайте замеры выключив все лишние программы.
Чем чище диспетчер задач тем лучше.
Просто, если вы делаете замеры, а параллельно открываете/закрываете браузер, играете в игры и т. д., то, я готов поспорить, что некоторые бенчмарки наверняка покажут причудливые результаты.
Желательно вообще никак не трогать машину. Чем меньше взаимодействия с ней, тем точнее результаты.
Хорошие практики
С вариантами, как запороть тесты мы разобрались, теперь давайте поговорим о том, как сделать их репрезентативнее.
Профилактика оптимизаций компилятора
(О боже, я сказал это вслух).