home.social

#кэш — Public Fediverse posts

Live and recent posts from across the Fediverse tagged #кэш, aggregated by home.social.

  1. Динамический полиморфизм против std::variant с указателями: Разрушаем мифы о скорости std::visit (v.2*)

    В экосистеме современного C++ прочно укоренилось мнение: классический динамический полиморфизм через виртуальные функции ( vtable ) и наследование — это устаревший, медленный и недружелюбный к кэшу процессора механизм. В качестве «серебряной пули» модно предлагать связку std::variant и std::visit . Если вы спросите любого виртуального умника (ИИ) он до последнего будет убеждать вас что std::variant и std::visit всегда(!) лучше чем виртуальные функции, даже не сомневайтесь. Проблема в том что с таким отношением вы во многих случаях просто лишаете себя выбора адекватного технического решения. Решения адекватного условиям конкретной задачи с необходимостью диспетчеризации вызовов. По интернету кочуют статьи, утверждающие, что std::visit выполняет диспетчеризацию за фиксированное время O(1) и полностью уничтожает старый добрый ООП-подход, но вы должны понимать что не существует универсальных решений на все случаи жизни. А что если мы попробуем уравнять начальные условия использования обеих техник диспетчеризации и будем использовать вариант с указателями, а не с эмплейс-объектами: std::vector< std::unique_ptr < BaseClass>> и std::vector<std::variant std::unique_ptr< TypeA>, std::unique_ptr< TypeB>, std::unique_ptr< TypeC>>> в условиях раздельной компиляции классов и кода который делает вызовы (зачем это надо?).

    habr.com/ru/articles/1047930/

    #visit #vtable #функции #кэш #динамический_полиморфизм #cplusplus #assembler

  2. Динамический полиморфизм против std::variant с указателями: Разрушаем мифы о скорости std::visit (v.2*)

    В экосистеме современного C++ прочно укоренилось мнение: классический динамический полиморфизм через виртуальные функции ( vtable ) и наследование — это устаревший, медленный и недружелюбный к кэшу процессора механизм. В качестве «серебряной пули» модно предлагать связку std::variant и std::visit . Если вы спросите любого виртуального умника (ИИ) он до последнего будет убеждать вас что std::variant и std::visit всегда(!) лучше чем виртуальные функции, даже не сомневайтесь. Проблема в том что с таким отношением вы во многих случаях просто лишаете себя выбора адекватного технического решения. Решения адекватного условиям конкретной задачи с необходимостью диспетчеризации вызовов. По интернету кочуют статьи, утверждающие, что std::visit выполняет диспетчеризацию за фиксированное время O(1) и полностью уничтожает старый добрый ООП-подход, но вы должны понимать что не существует универсальных решений на все случаи жизни. А что если мы попробуем уравнять начальные условия использования обеих техник диспетчеризации и будем использовать вариант с указателями, а не с эмплейс-объектами: std::vector< std::unique_ptr < BaseClass>> и std::vector<std::variant std::unique_ptr< TypeA>, std::unique_ptr< TypeB>, std::unique_ptr< TypeC>>> в условиях раздельной компиляции классов и кода который делает вызовы (зачем это надо?).

    habr.com/ru/articles/1047930/

    #visit #vtable #функции #кэш #динамический_полиморфизм #cplusplus #assembler

  3. Динамический полиморфизм против std::variant с указателями: Разрушаем мифы о скорости std::visit (v.2*)

    В экосистеме современного C++ прочно укоренилось мнение: классический динамический полиморфизм через виртуальные функции ( vtable ) и наследование — это устаревший, медленный и недружелюбный к кэшу процессора механизм. В качестве «серебряной пули» модно предлагать связку std::variant и std::visit . Если вы спросите любого виртуального умника (ИИ) он до последнего будет убеждать вас что std::variant и std::visit всегда(!) лучше чем виртуальные функции, даже не сомневайтесь. Проблема в том что с таким отношением вы во многих случаях просто лишаете себя выбора адекватного технического решения. Решения адекватного условиям конкретной задачи с необходимостью диспетчеризации вызовов. По интернету кочуют статьи, утверждающие, что std::visit выполняет диспетчеризацию за фиксированное время O(1) и полностью уничтожает старый добрый ООП-подход, но вы должны понимать что не существует универсальных решений на все случаи жизни. А что если мы попробуем уравнять начальные условия использования обеих техник диспетчеризации и будем использовать вариант с указателями, а не с эмплейс-объектами: std::vector< std::unique_ptr < BaseClass>> и std::vector<std::variant std::unique_ptr< TypeA>, std::unique_ptr< TypeB>, std::unique_ptr< TypeC>>> в условиях раздельной компиляции классов и кода который делает вызовы (зачем это надо?).

    habr.com/ru/articles/1047930/

    #visit #vtable #функции #кэш #динамический_полиморфизм #cplusplus #assembler

  4. Гранулярное погружение в атаки на кэш в ARMv8. Разбираем типы атак и митигации

    Привет! Без лишнего: в статье расскажу про атаки на кэш-память в процессорах семейства ARMv8. Подробно изучил их для совершенствования безопасности KasperskyOS: познакомлю с теорией и практикой, механизмами работы и способами митигации. Также кратко расскажу, как мы тестировали каждый способ атаки на KasperskyOS, какие из них оказались неприменимы, какие могут представлять угрозу и как микроядро с подобными угрозами справляется. Если интересно гранулярно погрузиться в типологию атак на кэш — добро пожаловать!

    habr.com/ru/companies/kaspersk

    #информационная_безопасность #системное_программирование #кэш #armv8 #процессоры #атаки #микроядро #операционные_системы #ос #программирование

  5. [Перевод] Миф о RAM

    Миф о RAM — это верование о том, что память современного компьютера напоминает идеальную память с произвольным доступом. Кэш люди считают оптимизацией для малых данных: если они умещаются в L2, то будут обрабатываться быстрее; если нет, то тут уж ничего не поделаешь. Вероятнее всего, что самым быстрым разбиения данных будет такой код (я использую в качестве псевдокода Python; можете представить, что я пишу это на вашем любимом низкоуровневом языке): groups = [[] for _ in range(n_groups)] for element in elements: groups[element.group].append(element) Он и в самом деле линеен (то есть асимптотически оптимален), и мы всё равно должны выполнять доступ к произвольным индексам, так что кэш здесь нам ни в чём бы не помог. В реальности, когда количество групп высоко, такой код не задействует большую часть производительности, а некоторые асимптотически более медленные алгоритмы могут выполнять сегментирование гораздо быстрее. В основном они применяются в базах данных на диске, но, как ни странно, полезны даже в случае данных в RAM.

    habr.com/ru/articles/868452/

    #кэш #работа_с_памятью #оптимизация_кода #озу #оперативная_память

  6. [Перевод] Миф о RAM

    Миф о RAM — это верование о том, что память современного компьютера напоминает идеальную память с произвольным доступом. Кэш люди считают оптимизацией для малых данных: если они умещаются в L2, то будут обрабатываться быстрее; если нет, то тут уж ничего не поделаешь. Вероятнее всего, что самым быстрым разбиения данных будет такой код (я использую в качестве псевдокода Python; можете представить, что я пишу это на вашем любимом низкоуровневом языке): groups = [[] for _ in range(n_groups)] for element in elements: groups[element.group].append(element) Он и в самом деле линеен (то есть асимптотически оптимален), и мы всё равно должны выполнять доступ к произвольным индексам, так что кэш здесь нам ни в чём бы не помог. В реальности, когда количество групп высоко, такой код не задействует большую часть производительности, а некоторые асимптотически более медленные алгоритмы могут выполнять сегментирование гораздо быстрее. В основном они применяются в базах данных на диске, но, как ни странно, полезны даже в случае данных в RAM.

    habr.com/ru/articles/868452/

    #кэш #работа_с_памятью #оптимизация_кода #озу #оперативная_память

  7. [Перевод] Миф о RAM

    Миф о RAM — это верование о том, что память современного компьютера напоминает идеальную память с произвольным доступом. Кэш люди считают оптимизацией для малых данных: если они умещаются в L2, то будут обрабатываться быстрее; если нет, то тут уж ничего не поделаешь. Вероятнее всего, что самым быстрым разбиения данных будет такой код (я использую в качестве псевдокода Python; можете представить, что я пишу это на вашем любимом низкоуровневом языке): groups = [[] for _ in range(n_groups)] for element in elements: groups[element.group].append(element) Он и в самом деле линеен (то есть асимптотически оптимален), и мы всё равно должны выполнять доступ к произвольным индексам, так что кэш здесь нам ни в чём бы не помог. В реальности, когда количество групп высоко, такой код не задействует большую часть производительности, а некоторые асимптотически более медленные алгоритмы могут выполнять сегментирование гораздо быстрее. В основном они применяются в базах данных на диске, но, как ни странно, полезны даже в случае данных в RAM.

    habr.com/ru/articles/868452/

    #кэш #работа_с_памятью #оптимизация_кода #озу #оперативная_память

  8. Дилемма 3n+1 на Java. Кэшируем рекурсию

    Приветствую всех, сегодня я хочу рассказать про одну из самых интересных неразгаданных загадок математики. Гипотеза Коллатца, или же дилемма 3n+1 прославилась благодаря простоте своей формулировки, при этом оставаясь не доказанной уже более 90 лет. В этом выпуске : обзор самой гипотезы, код-снипеты, кэширование, рекурсия, и много чего еще. Поехали. Краткая формулировка, то бишь немного измененная выдержка из википедии Collatz conjecture — Wikipedia Гипотеза Коллатца — Википедия (wikipedia.org) : Берём любое натуральное число n: 1) Если оно чётное, то делим его на 2, 2) Если нечётное, то умножаем на 3 и прибавляем 1. Над полученным числом выполняем те же самые действия, и так далее.

    habr.com/ru/articles/839352/

    #гипотеза_коллатца #Guava_cache #collatz_conjecture #кэш #оптимизация #3n+1_problem

  9. Дилемма 3n+1 на Java. Кэшируем рекурсию

    Приветствую всех, сегодня я хочу рассказать про одну из самых интересных неразгаданных загадок математики. Гипотеза Коллатца, или же дилемма 3n+1 прославилась благодаря простоте своей формулировки, при этом оставаясь не доказанной уже более 90 лет. В этом выпуске : обзор самой гипотезы, код-снипеты, кэширование, рекурсия, и много чего еще. Поехали. Краткая формулировка, то бишь немного измененная выдержка из википедии Collatz conjecture — Wikipedia Гипотеза Коллатца — Википедия (wikipedia.org) : Берём любое натуральное число n: 1) Если оно чётное, то делим его на 2, 2) Если нечётное, то умножаем на 3 и прибавляем 1. Над полученным числом выполняем те же самые действия, и так далее.

    habr.com/ru/articles/839352/

    #гипотеза_коллатца #Guava_cache #collatz_conjecture #кэш #оптимизация #3n+1_problem

  10. Дилемма 3n+1 на Java. Кэшируем рекурсию

    Приветствую всех, сегодня я хочу рассказать про одну из самых интересных неразгаданных загадок математики. Гипотеза Коллатца, или же дилемма 3n+1 прославилась благодаря простоте своей формулировки, при этом оставаясь не доказанной уже более 90 лет. В этом выпуске : обзор самой гипотезы, код-снипеты, кэширование, рекурсия, и много чего еще. Поехали. Краткая формулировка, то бишь немного измененная выдержка из википедии Collatz conjecture — Wikipedia Гипотеза Коллатца — Википедия (wikipedia.org) : Берём любое натуральное число n: 1) Если оно чётное, то делим его на 2, 2) Если нечётное, то умножаем на 3 и прибавляем 1. Над полученным числом выполняем те же самые действия, и так далее.

    habr.com/ru/articles/839352/

    #гипотеза_коллатца #Guava_cache #collatz_conjecture #кэш #оптимизация #3n+1_problem

  11. [Перевод] Механизм перезапускаемых последовательностей (Rseq) при работе с TCMalloc

    ❯ Кэши для отдельных ядер процессора В TCMalloc кэши для отдельных ядер процессора реализуются при помощи перезапускаемых последовательностей (man rseq(2)) под Linux. Эту возможность ядра разработали Пол Тёрнер и Эндрю Хантер из Google , а также Мэтью Дезнойерс из EfficiOS. При помощи перезапускаемых последовательностей можно вплоть до завершения выполнять область памяти (атомарно, относительно других потоков, выполняющихся на том же ядре процессора), либо выходить из этого процесса, если ядро прервёт этот процесс, например, вытеснив его или прервавшись на обработку сигнала. Если вы хотите организовать перезапуск системы при миграции с ядра на ядро или при вытеснении процесса, то наиболее общий случай такой операции можно оптимизировать (не переносить с ядра на ядро тот процесс, который уже выполняется), избегая атомарных операций. Можно оптимизировать и более редкий случай – вытеснение как таковое. В результате такого компромисса нужно обеспечить, чтобы на всех путях выполнения нашего кода поддерживались такие операции перезапуска. Вся последовательность, кроме окончательного сохранения в памяти, когда изменение фиксируется, должна быть приспособлена к перезапуску.

    habr.com/ru/companies/timeweb/

    #timeweb_статьи_перевод #Rseq #TCMalloc #Google #EfficiOS #ядро #ID #ПК #C++ #массивы #ЦП #begin #x86 #процессор #кэш