Когда и как оптимизировать программу
Мы, программисты, любим оптимизировать, да? Было медленно, стало быстро. Кайф же-ж! Всё б оптимизировать.
Но опытные ребята знают, что преждевременная оптимизация - корень всех зол. Почему? Да потому что провозиться с ней можно долго, а продуктового выхлопа будет с гулькин нос. Тут как с рефакторингом: сначала нужно доказать себе и окружающим, что это нужно, а потом уже делать. Как раз тогда оптимизация превращается из преждевременной в своевременную.
Но если собрались оптимизировать, то начните с одного из 4-х универсальных подходов. Подходы придумал не я, а Laurence Tratt . Но мне они очень откликаются. Итак:
1. Использование лучшего алгоритма. Все, что нужно - это подобрать алгоритм пошустрее. Но придется повозиться, чтобы не оказалось так, что улучшение наступит только на ограниченном наборе данных.
2. Использование лучших структур данных. Этот способ согласуется с предыдущим. Возможно ваш алгоритм не плохой, а вот структура данных подкачала. Например, если предварительно отсортировать данные, то прирост скорости того же алгоритма окажется внушительным.
3. Низкоуровневая реализация. А чего бы не переписать критическую часть на ассемблере? Вариант, конечно, но сложновато. Здесь лучше начать с более простых низкоуровневых оптимизаций самого компилятора (или интерпретатора). Сначала выжмите максимум из своего инструмента.
4. Снижение точности вычислений. Нужно убедиться, что точность вычислений соответствует решаемым задачам: не стоит ловить тысячные доли там, где хватит десятых. С другой стороны бывает, что даже значительное снижение точности вообще не приводит к ухудшению результата, если их зависимость ползет плавно вниз вдоль асимптоты.
Laurence Tratt приводит эти пункты в порядке частоты использования им самим. Но вообще лучше начинать с решений попроще. А простота зависит от контекста. Поэтому в любом случае нужно будет пораскинуть мозгами 😁
📍 Рекомендую пробежаться по самой статье "Laurence Tratt - Four Kinds of Optimisation", чтобы закрепить пункты выше конкретными примерами.
—
Еще про оптимизацию от Фленова (+ его канал)
Мы, программисты, любим оптимизировать, да? Было медленно, стало быстро. Кайф же-ж! Всё б оптимизировать.
Но опытные ребята знают, что преждевременная оптимизация - корень всех зол. Почему? Да потому что провозиться с ней можно долго, а продуктового выхлопа будет с гулькин нос. Тут как с рефакторингом: сначала нужно доказать себе и окружающим, что это нужно, а потом уже делать. Как раз тогда оптимизация превращается из преждевременной в своевременную.
Но если собрались оптимизировать, то начните с одного из 4-х универсальных подходов. Подходы придумал не я, а Laurence Tratt . Но мне они очень откликаются. Итак:
1. Использование лучшего алгоритма. Все, что нужно - это подобрать алгоритм пошустрее. Но придется повозиться, чтобы не оказалось так, что улучшение наступит только на ограниченном наборе данных.
2. Использование лучших структур данных. Этот способ согласуется с предыдущим. Возможно ваш алгоритм не плохой, а вот структура данных подкачала. Например, если предварительно отсортировать данные, то прирост скорости того же алгоритма окажется внушительным.
3. Низкоуровневая реализация. А чего бы не переписать критическую часть на ассемблере? Вариант, конечно, но сложновато. Здесь лучше начать с более простых низкоуровневых оптимизаций самого компилятора (или интерпретатора). Сначала выжмите максимум из своего инструмента.
4. Снижение точности вычислений. Нужно убедиться, что точность вычислений соответствует решаемым задачам: не стоит ловить тысячные доли там, где хватит десятых. С другой стороны бывает, что даже значительное снижение точности вообще не приводит к ухудшению результата, если их зависимость ползет плавно вниз вдоль асимптоты.
Laurence Tratt приводит эти пункты в порядке частоты использования им самим. Но вообще лучше начинать с решений попроще. А простота зависит от контекста. Поэтому в любом случае нужно будет пораскинуть мозгами 😁
📍 Рекомендую пробежаться по самой статье "Laurence Tratt - Four Kinds of Optimisation", чтобы закрепить пункты выше конкретными примерами.
—
Еще про оптимизацию от Фленова (+ его канал)
👍2❤1
Так себе программист
Когда и как оптимизировать программу Мы, программисты, любим оптимизировать, да? Было медленно, стало быстро. Кайф же-ж! Всё б оптимизировать. Но опытные ребята знают, что преждевременная оптимизация - корень всех зол. Почему? Да потому что провозиться с…
Перед тем как читать эту статью 👆, я попросил DeepSeek сделать выжимку. Ну чтобы понять, стоит углубляться или нет.
Выжимка зашла, я полез почитать и уже на втором пункте понял, что в выжимке было другое. Ну сами посмотрите: ИИ сформулировал правильно только один пункт! Остальные вообще не про то.
И как после этого ему доверять? 😁
Как говорили в одном мультике: "У этого чудовища нет зубов. Не проглотит он нас всех не жуя"
Выжимка зашла, я полез почитать и уже на втором пункте понял, что в выжимке было другое. Ну сами посмотрите: ИИ сформулировал правильно только один пункт! Остальные вообще не про то.
И как после этого ему доверять? 😁
Как говорили в одном мультике: "У этого чудовища нет зубов. Не проглотит он нас всех не жуя"
😁2
#include <iostream>
int main()
{
int** b = new int*[]
{
new int(1),
new int(2),
new int(3)
};
int* b1 = b[1];
int* b2 = b[2];
delete [] b;
std::cout << *b1 + *b2;
return 0;
}
Выше дан код C++. Какой вывод будет у программы?
Anonymous Quiz
24%
3
35%
5
18%
Неизвестно. Неопределенное поведение
24%
Никакой. Падение при разыменовании b1
Эмулятор или симулятор
Эмулятор - это программа, моделирующая другую систему с высокой точностью. По сути эмулятор создает полнофункциональный клон целевой системы.
Симулятор - это программа, моделирующая лишь некоторые функции целевой системы.
То есть разница в точности моделирования.
Авиасимулятор на то и симулятор, что моделирует не все аспекты управления самолетом. Например, органы управления могут быть полностью функциональны, хотя перегрузки ощущаться не будут.
А вот эмулятор Android на ПК работает так, что Android-приложение и не заметит, что оно выполняются не на железном устройстве. Эмулятор заменит все "железные" функции. Ну или почти все 🤫
#Словарь
Эмулятор - это программа, моделирующая другую систему с высокой точностью. По сути эмулятор создает полнофункциональный клон целевой системы.
Симулятор - это программа, моделирующая лишь некоторые функции целевой системы.
То есть разница в точности моделирования.
Авиасимулятор на то и симулятор, что моделирует не все аспекты управления самолетом. Например, органы управления могут быть полностью функциональны, хотя перегрузки ощущаться не будут.
А вот эмулятор Android на ПК работает так, что Android-приложение и не заметит, что оно выполняются не на железном устройстве. Эмулятор заменит все "железные" функции. Ну или почти все 🤫
#Словарь
🔥2
🥇Представляете, получил золотой значок на Stack Overflow. И не абы за что, а за лайки!
То есть за 10 лет с момента регистрации я "налайкал" аж 600 вопросов! 😁
—
Все таки ачивки - интересная тема. Создают событие на пустом месте. Да не просто событие, а целый праздник, награда! Человекам нравится👍
Но не в любом продукте это пойдет на пользу. Представьте, если бы Телеграм ввел значки за 100, 1000 или миллион отправленных сообщений! Тогда бы количество людей, печатающих по одному слову на сообщение возросло бы кратно 😅 Жуть)
А где еще есть ачивки, помните? Ну помимо игр.
Навскидку вспомню только Яндекс Карты, где награждают за отзывы.
То есть за 10 лет с момента регистрации я "налайкал" аж 600 вопросов! 😁
—
Все таки ачивки - интересная тема. Создают событие на пустом месте. Да не просто событие, а целый праздник, награда! Человекам нравится
Но не в любом продукте это пойдет на пользу. Представьте, если бы Телеграм ввел значки за 100, 1000 или миллион отправленных сообщений! Тогда бы количество людей, печатающих по одному слову на сообщение возросло бы кратно 😅 Жуть)
А где еще есть ачивки, помните? Ну помимо игр.
Навскидку вспомню только Яндекс Карты, где награждают за отзывы.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
#include <iostream>
int main()
{
int* a = new int[3]();
int* b = new int[]{1, 2, 3};
std::cout << a[0] + b[0] << " "
<< a[1] + b[1] << " "
<< a[2] + b[2];
delete [] a;
delete [] b;
return 0;
}
Выше дан код C++. Какой вывод будет у программы?
Anonymous Quiz
50%
1 2 3
0%
0 2 4
39%
Неизвестно. Неопределенное поведение
11%
Никакой. Ошибка компиляции
Что такое САПР?
В новом видео мы поговорим о САПР — системах автоматизированного проектирования. Сначала вспомним историю и назначение САПР, а потом создадим простую 3D модель в бесплатной программе FreeCAD.
Никакого программирования - чисто пользовательские кейсы, чтобы понять что к чему.
📱 Смотреть на YouTube
📱 Смотреть во ВКонтакте
—
Если видео показалось мало, вот дополнительные материалы:
- Обзор на САПР - хронология развития САПР.
- КОМПАС-3D: Знакомство с САПР - легкое обзорное видео о назначении САПР.
- Краткая история САПР от Autodesk [ENG] - анимация с экскурсом в далекую историю САПР.
- Журнал "САПР и графика" - если хочется быть в курсе новостей.
К теме САПР я буду периодически возвращаться в рамках академической работы. Как своей, так и студентов.
В новом видео мы поговорим о САПР — системах автоматизированного проектирования. Сначала вспомним историю и назначение САПР, а потом создадим простую 3D модель в бесплатной программе FreeCAD.
Никакого программирования - чисто пользовательские кейсы, чтобы понять что к чему.
—
Если видео показалось мало, вот дополнительные материалы:
- Обзор на САПР - хронология развития САПР.
- КОМПАС-3D: Знакомство с САПР - легкое обзорное видео о назначении САПР.
- Краткая история САПР от Autodesk [ENG] - анимация с экскурсом в далекую историю САПР.
- Журнал "САПР и графика" - если хочется быть в курсе новостей.
К теме САПР я буду периодически возвращаться в рамках академической работы. Как своей, так и студентов.
Please open Telegram to view this post
VIEW IN TELEGRAM
😁2👍1
Не знаю, как у вас, а у меня регулярные выражения - это отдельный нелюбимый квест. Каждый раз, когда сталкиваюсь с регуляркой, я бегу за справочником и минимум час въезжаю. Въезжаю, чтобы потом опять забыть на полгода-год 🤨
Спасибо еще есть онлайн-инструменты, где можно разобрать, протестировать и даже отладить регулярку. Иначе я не знаю, что бы делал 🤯
А у вас регулярки тоже боль?
Надеюсь, я не один в этом клубе 😁
😁 - да, у меня всё так же
👍 - нет, пишу/читаю без проблем
—
⬇️ Ну и для интереса давайте махнём тестик. Поломаем глаза об эти петроглифы-иероглифы)
Спасибо еще есть онлайн-инструменты, где можно разобрать, протестировать и даже отладить регулярку. Иначе я не знаю, что бы делал 🤯
А у вас регулярки тоже боль?
Надеюсь, я не один в этом клубе 😁
😁 - да, у меня всё так же
👍 - нет, пишу/читаю без проблем
—
⬇️ Ну и для интереса давайте махнём тестик. Поломаем глаза об эти петроглифы-иероглифы)
😁6👍1
Какое регулярное выражение подойдет для строки выше?
Anonymous Quiz
27%
/^([01][0-9]|2[0-3]):([0-5][0-9])$/gm
13%
/^(([0-1][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?)$/gm
7%
/^([01]?[0-9]|2[0-3]):[0-5][0-9]$/gm
53%
Все подходят
Литералы в C++
В C++ помимо стандартных литералов существуют пользовательские. И это, конечно, здорово, но сначала вспомним, что это вообще за зверь.
Литералы в C++ - это специальные символы, которые помогают нам организовывать константы. Хоть численные, хоть строковые. Например,
Так вот, пользовательские литералы в C++ позволяют создавать свои собственные литералы в виде суффиксов.
Например, можно создать литералы для единиц измерения. Представим, что нам в рамках разработки 🐘ЗооВикипедии🐈 нужно вывести на экран массу слона, кошки и воробья в граммах.
Но кто будет вешать слона в граммах? Слишком много цифр, это не воспринимается.
Спросите кого-нибудь: "Сколько весит слон?". И вряд ли вы получите ответ: "Ну граммов пять миллионов, так, плюс-минус..." 🤔
Поэтому берём литералы и делаем:
👆 Слона мы взвесили в тоннах
Константы выглядят лаконично, а на экран печатаются граммы:
Однако на практике я этой фишкой не пользовался. Можно было бы где-то байты-килобайты прикрутить, но вообще... Даже не знаю.
А вы создавали свои литералы?
👍 - было дело
🤷♂️ - как-то не приходилось
—
Если скучно, можно еще вспомнить
В C++ помимо стандартных литералов существуют пользовательские. И это, конечно, здорово, но сначала вспомним, что это вообще за зверь.
Литералы в C++ - это специальные символы, которые помогают нам организовывать константы. Хоть численные, хоть строковые. Например,
42
- это просто число, а 42L
- уже число типа long
. Символ L
- это литерал.Так вот, пользовательские литералы в C++ позволяют создавать свои собственные литералы в виде суффиксов.
Например, можно создать литералы для единиц измерения. Представим, что нам в рамках разработки 🐘ЗооВикипедии🐈 нужно вывести на экран массу слона, кошки и воробья в граммах.
Но кто будет вешать слона в граммах? Слишком много цифр, это не воспринимается.
Спросите кого-нибудь: "Сколько весит слон?". И вряд ли вы получите ответ: "Ну граммов пять миллионов, так, плюс-минус..." 🤔
Поэтому берём литералы и делаем:
#include <iostream>
// Литерал тонны
constexpr double operator"" _t(long double mass) {
return mass * 1000 * 1000;
}
// Литерал килограмма
constexpr double operator"" _kg(long double mass) {
return mass * 1000;
}
// Литерал грамма
constexpr double operator"" _g(long double mass) {
return mass;
}
int main() {
const double elephantMass = 5.0_t;
const double catMass = 4.2_kg;
const double sparrowMass = 25.0_g;
std::cout << "Elephant mass: " << elephantMass << "g\n";
std::cout << "Cat mass: " << catMass << "g\n";
std::cout << "Sparrow mass: " << sparrowMass << "g\n";
return 0;
}
👆 Слона мы взвесили в тоннах
_t
, кошку - в килограммах _kg
, а воробья - так уж и быть, в граммах _g
. Константы выглядят лаконично, а на экран печатаются граммы:
Elephant mass: 5e+06g
Cat mass: 4200g
Sparrow mass: 25g
Однако на практике я этой фишкой не пользовался. Можно было бы где-то байты-килобайты прикрутить, но вообще... Даже не знаю.
А вы создавали свои литералы?
👍 - было дело
🤷♂️ - как-то не приходилось
—
Если скучно, можно еще вспомнить
inline
в С++🤷♂3🔥2👍1
Сегодня много буков, но я в вас верю 😊👇
#include <iostream>
class MyClass
{
public:
MyClass(int value) : m_value(value) {}
MyClass(const MyClass& other) :
m_value(other.m_value)
{
std::cout << "Copy constructor called ("
<< m_value << ")\n";
}
MyClass& operator=(const MyClass& other)
{
m_value = other.m_value;
std::cout << "Assignment operator called ("
<< m_value << ")\n";
return *this;
}
private:
int m_value;
};
int main()
{
MyClass obj1(10);
MyClass obj2 = obj1;
return 0;
}
😁2
Выше дан код C++. Какой вывод будет у программы?
Anonymous Quiz
28%
Copy constructor called (10)
39%
Assignment operator called (10)
17%
Неизвестно. Неопределенное поведение
17%
Никакой. Методы не вызываются
Марсоход без багов?
Вместо сказок на ночь хорошо зашла космическая фантастика про марсоход "Резилиенс". С необычным сюжетом.
Повествование ведется от лица самого марсохода. Инженеры НАСА что-то там в нем напрограммировали, что марсоход начал соображать и даже испытывать эмоции. Но никто этого успешно не заметил, а марсоход никому не сказал: не было нужного интерфейса.
Сюжет пересказывать не буду, сами почитаете 😁
Но вот интересная вещь. В конце книги автор рассказывает, что было выдумкой, а что - фактом. Очень кстати для детской литературы.
Но одну выдумку, на мой взгляд, она пропустила 🧐👇
Марсоход "Резилиенс" питал особенные чувства к своей главной разработчице Рании, потому что она всегда писала код без багов. Да, так и говорил:
или:
Вообще... Вообще мне нравится научная фантастика, но это по-моему перебор) Мегафантастично!
Хотя...
Вы знаете кого-нибудь, кто пишет "четкий код без багов"?
👍 - да, это я
😁 - да, но это не я
🤷♂️ - нет, не попадались
—
📍 Почитать книгу можно бесплатно на НЭБ.Дети: Жасмин Варга - Резилиенс. Марсоход с большим сердцем (2024)
#КнижнаяПолка
Вместо сказок на ночь хорошо зашла космическая фантастика про марсоход "Резилиенс". С необычным сюжетом.
Повествование ведется от лица самого марсохода. Инженеры НАСА что-то там в нем напрограммировали, что марсоход начал соображать и даже испытывать эмоции. Но никто этого успешно не заметил, а марсоход никому не сказал: не было нужного интерфейса.
Сюжет пересказывать не буду, сами почитаете 😁
Но вот интересная вещь. В конце книги автор рассказывает, что было выдумкой, а что - фактом. Очень кстати для детской литературы.
Но одну выдумку, на мой взгляд, она пропустила 🧐👇
Марсоход "Резилиенс" питал особенные чувства к своей главной разработчице Рании, потому что она всегда писала код без багов. Да, так и говорил:
Рания действует строго по схеме. Рания — это ритмичность и надежность. Рания — это стук по клавишам компьютера и выверенные решения с результатами точных вычислений. Рания — это изящно прописанный код без ошибок, которые люди в защитных костюмах называют багами.
или:
Моя система всегда определяет код Рании. Никто не пишет такой четкий код без багов, как Рания.
Вообще... Вообще мне нравится научная фантастика, но это по-моему перебор) Мегафантастично!
Хотя...
Вы знаете кого-нибудь, кто пишет "четкий код без багов"?
👍 - да, это я
😁 - да, но это не я
🤷♂️ - нет, не попадались
—
📍 Почитать книгу можно бесплатно на НЭБ.Дети: Жасмин Варга - Резилиенс. Марсоход с большим сердцем (2024)
#КнижнаяПолка
🤷♂7👍2
Путаница в интерфейсах (часть 6)
Гугло-календарь предложил начать новую жизнь*. Что нажать?
👉 ЗАДАЧА ВЫПОЛНЕНА - это, наверное, значит, что я уже начал новую жизнь.
👉 ДА - это, наверное, значит, что я готов начать здесь и сейчас.
Или не значит. Или не наверное... Не понятно.
А где же НАПОМНИТЬ ЧЕРЕЗ 5 МИНУТ ?
Очень кстати, если сейчас немного занят для новой жизни.
🤨 Короче, тупик.
* ну не то, чтобы прямо предложил, просто пример хороший)
—
Читать Путаница в интерфейсах (часть 5)
Гугло-календарь предложил начать новую жизнь*. Что нажать?
👉 ЗАДАЧА ВЫПОЛНЕНА - это, наверное, значит, что я уже начал новую жизнь.
👉 ДА - это, наверное, значит, что я готов начать здесь и сейчас.
Или не значит. Или не наверное... Не понятно.
А где же НАПОМНИТЬ ЧЕРЕЗ 5 МИНУТ ?
Очень кстати, если сейчас немного занят для новой жизни.
🤨 Короче, тупик.
* ну не то, чтобы прямо предложил, просто пример хороший)
—
Читать Путаница в интерфейсах (часть 5)
😁4👍1
Выше дан код из Интернета. Какой язык программирования используется?
Anonymous Quiz
3%
C++
0%
Assembler
11%
BlueCode
86%
Pascal