Допустим, у меня есть программа, установленная как на USB-накопителе, так и на компьютере. Как на USB-накопителе, так и на компьютере есть общая папка программы с полными правами доступа для всех. Если создать подключенный сетевой диск к одной из этих двух папок, я предполагаю, что программа, которую я запускаю с компьютера, будет работать намного быстрее, чем флэш-накопитель USB, верно?
Это только из-за скорости жесткого диска, которую он может читать / записывать, которая определяет скорость программы и как быстро она может работать по сети? Как насчет количества компьютеров, на которых работает один и тот же файл?
Технически ли файл запускается на отдельном компьютере или имеет значение, с какого компьютера он запускается, чтобы убедиться, что он не сильно перегружается при запуске с нескольких компьютеров по сети? Это просто сводится к самому Маршрутизатору / Модему и как быстро он передает данные?
Короче говоря, я просто хочу знать, есть ли существенная разница между запуском программы с подключенного сетевого диска, который находится на USB-накопителе или компьютере РЕДАКТИРОВАТЬ — Так как я получил отрицательный голос за очевидно не полностью объясняя тип ситуации более конкретно, я добавлю более подробную информацию о том, почему я спрашиваю. У меня есть программа размером около 10 МБ, которая постоянно читает / записывает в локальный файл SQL, который хранится в папке Mapped Network Drive (USB-накопитель или жесткий диск на компьютере) Я решил переместить папку на внешний жесткий диск (или, возможно, даже небольшой USB-накопитель) вместо установки программного обеспечения на компьютер на тот случай, если в будущем мне потребуется перенести USB/ внешний диск на новое место. Больше всего меня беспокоит то, что в разных «средах» эта программа может быть запущена по сети и иметь доступ с 1-15 компьютеров одновременно, в зависимости от того, где я нахожусь. Я хочу знать, могу ли я ожидать, что основная скорость, с которой пользователи запускают программу по сети через USB/External, будет отличаться от того, что она вместо этого находится на жестком диске компьютера.
КАК РАБОТАЕТ КЭШ ПРОЦЕССОРА Почему тип int самый быстрый
Источник: poweruser.guru
Немного о скорости выполнения программ на Arduino-совместимых платах. Часть 2: Пишем программу оптимально: пора сниматься с ручника
В прошлой части было рассказано об основных факторах, влияющих на скорость выполнения программ, а также были описаны методы её повышения повышением вычислительной мощности платы.
01. Оптимизация C++ совмещаем скорость и высокий уровень — Евгений Петров
Скорость выполнения программы сильно зависит от вычислительной мощности процессора. Но больше всего на скорость выполнения программы влияет её структура. И для ускорения работы программы её нужно оптимизировать, сокращая число операций, выполняемых в критичных к скорости местах программы.
Рассмотрим это на примере одних из самых часто выполняемых операций – на примере цифрового вывода в линию порта функцией digitalWrite. Вы когда-либо задавали себе вопрос «Сколько времени занимает запись единицы или нуля в линию порта?». Вряд ли. На это редко обращают внимание. А зря…
Давайте измерим время выполнения функции digitalWrite. Для этого возьмём стандартный скетч «Blink» и просто уберём из него задержки (рис. 1) – будем как можно быстрее записывать в линию порта ноль и единицу. Загрузим получившийся скетч в плату и логическим анализатором измерим продолжительность единицы и нуля на линии порта (рис. 2).
Результаты удивляют — примерно по 7.5 мкс (микросекунд) на запись единицы и нуля. Удивляют тем, что такая простая функция может съедать так много времени.
Одна операция выполняется микроконтроллером семейства AVR за один такт. При стандартной тактовой частоте 16 МГц на выполнение одной элементарной операции уходит 0,0625 мкс. Следовательно, функция digitalWrite состоит из примерно 120 элементарных операций. Много это или мало? Это ужасно много.
Забегая наперёд, скажем, что для этого достаточно всего двух элементарных операций. Так почему же функция digitalWrite содержит аж 120?
Всё кроется в самой концепции Arduino. Платформа Arduino предназначена для новичков, поэтому в ней реализовано максимальное удобство для пользователя, местами в ущерб другим характеристикам. Например, пользователь при использовании функции digitalWrite оперирует лишь условным номером линии порта (№15 в нашем примере).
Ему, в частности, не нужно знать внутреннюю структуру аппаратных портов микроконтроллера, допустимые режимы работы каждой линии порта, их привязку к выводам самого микроконтроллера. Этим всем, как раз, и занимается функция digitalWrite. Она ищет соответствующие условному номеру регистры аппаратного порта, проверяет, в каком состоянии нужная линия порта, в каком режиме она работает (не используется ли эта линия порта при работе цифровых интерфейсов, ШИМ и т. д.). К тому же, эта функция написана не оптимально.
Забота о пользователях – это, несомненно, хорошо. Но что, если вы уже стали опытным ардуинщиком и в вашем новом устройстве важна скорость работы программы? Решение есть. Реализуем цифровой вывод в линию порта стандартным способом языка С – просто запишем значение «1» и «0» в нужный разряд нужного регистра микроконтроллера по схеме платы.
Для этого найдём соответствующие наименование регистра и номер разряда. В нашей плате условной линии №15 соответствует линия PB7 — разряд 7 порта В, значит нам нужны регистр PORTB, 7-й разряд. Исправляем скетч, как показано на рис. 3, загружаем скетч в плату и повторяем измерения.
Смотрим на результаты (рис. 4). Ну это же совсем другое дело! Всё, как мы говорили (ну почти): 0,125 мкс (2 операции) на запись нуля и 1 мкс (16 операций) на запись единицы (из них 2 – собственно запись и ещё 14 безжалостно съедаются функцией loop, которая тоже не оптимизирована).
То есть, на один цикл работы у нас теперь уходит 1.125 мкс (18 тактов) вместо 15 мкс (240 тактов) – мы ускорили работу программы более чем в 13 раз. Но это – не предел оптимизации. Продолжение — в следующей части.
Выводы:
- Структура программы сильно влияет на скорость её выполнения, поэтому критичные к скорости участки программы обязательно нужно оптимизировать.
- Стандартные функции Arduino написаны неоптимально, но зато имеют защиту от неопытности пользователей.
Источник: educationrobots.ru
Производительность программы против читаемости и простоты кода: в пользу чего стоит делать выбор?
Одной из сильных сторон C++ является возможность написания очень производительного кода. Но значит ли это, что мы должны постоянно беспокоиться о производительности и писать весь код настолько производительно, насколько это возможно? Должны ли мы отказаться от простоты ради этого? А стоит ли?
Лично я так не думаю и могу привести много причин, почему не стоит жертвовать простотой и чистотой кода для повышения производительности. Я бы предпочел, чтобы все изначально писали простой и чистый код. Вот несколько из причин для такого выбора.
Производительность ≠ эффективность
В первую очередь нужно научиться различать производительность и эффективность. В чем разница? Если коротко: производительность влияет на то, как быстро вы что-то делаете, а эффективность — на то, сколько это занимает у вас времени.
Вроде бы одно и то же, скажете вы, и будете неправы. Представьте, что вы перемещаетесь из пункта А в пункт Б. Эффективно будет пойти кратчайшим путем. Производительно будет, если вы побежите. То есть, если вы на всех парах промчитесь по всему району, чтобы попасть к соседу, это будет производительно, но не эффективно.
В программировании циклы сильно влияют на время выполнения программы. В этом случае производительность будет отвечать за время выполнения одной итерации, а эффективность — за их количество, которое можно уменьшить лучшим алгоритмом.
Иногда эти понятия не пересекаются. Более эффективный алгоритм может быть менее производительным. Однако, прежде чем выжать максимум производительности из участка кода, убедитесь, что он эффективен. Только когда вы учли все возможности в плане эффективности, можно начать заниматься повышением производительности.
Порой для получения желаемой скорости достаточно повысить эффективность кода и не беспокоиться о производительности.
Производительность нужна не всегда
Это очевидно, но многие программисты, особенно начинающие, не всегда понимают это. На форумах висят сотни вопросов об оптимизации кода. При этом, если задается вопрос о том, является ли этот участок кода «бутылочным горлышком» для общей производительности, ответ на него чаще всего дается отрицательный.
Говорят, что 80% времени своей работы программа занимается выполнением 20% кода. Но точные числа здесь не важны. Главным является тот факт, что программа тратит большую часть времени на исполнение меньшей части кода.
Иными словами, это означает, что почти весь код мало влияет на время выполнения, и его оптимизация прироста скорости не даст.
Не оптимизируйте код, который не влияет на общую производительность программы.
На самом деле мы не знаем, как правильно оптимизировать
О да, как я посмел Дело в том, что огромное влияние на время выполнения программы имеет количество инструкций, исполняемых процессором. А их задаем не мы, а компилятор и его оптимизатор.
Оптимизаторы бывают разные, и если вы не эксперт, то вряд ли вы догадаетесь, что они делают с нетривиальным участком кода. Оптимизаторы могут удалять временные объекты, делать функции встроенными, порой даже во время линкования, и даже перемешивать и удалять многие из этих инструкций.
Так что мы можем сделать для повышения производительности с учетом этих суперсил компилятора и нашего незнания того, какой код оптимален? На первый взгляд — ничего. И если мы действительно беспокоимся о производительности, стоит положиться не на воображение и опыт, а на инструменты.
Изначально пишите поддерживаемый код, поскольку он вполне может быть достаточно производительным. Для улучшения производительности используйте профайлер.
Конечно же, вышесказанное не значит, что стоит писать непроизводительный код. Если есть два способа написать одинаково читаемый код, выбирайте более производительный. Например, используйте ++iter вместо iter++ , если вам не нужно сохранять результат выражения, и так далее.
Производительность и простота — не взаимоисключающие признаки
Серьезный вклад во время выполнения программы также вносит структура и расположение данных в памяти. Об этом можно прочитать хорошую статью, я не буду заострять свое внимание на этом вопросе.
Главное — если вы плохо структуризовали данные в памяти, это точно приведет к ухудшению производительности.
Убедитесь, что вы используете самые производительные структуры данных, прежде чем начать оптимизировать сам код.
Есть еще один способ написания производительного и простого кода: используйте проверенные библиотеки. Их авторы, как правило, умные ребята, и разбираются в производительности. Поэтому, если вы будете использовать библиотеки, а не свои решения, код будет не только проще, но и производительней.
Используйте библиотеки, но только если профайлер не жалуется на их плохую производительность.
Изначально пишите простой и читаемый код. Если же вы нашли проблему в производительности, исправить ее можно, не превращая код в быстрый, но непонятный беспорядок. Жертвуйте простотой ради производительности только в крайнем случае, и всегда используйте профайлер.
А что вы думаете по этому поводу? Делитесь мнениями в комментариях, и да начнётся холивар
Источник: tproger.ru