Pull to refresh

Разработчик VKD3D рассказал, что ошибки в коде Starfield замедляют игру и приводят к экстренному закрытию приложения

Reading time1 min
Views8.3K

Разработчик Ханс-Кристиан Арнтцен (Hans-Kristian Arntzen), развивающий форк проекта VKD3D для Proton, рассказал об ошибках в коде Starfield и неправильном использовании графических ресурсов ПК. Из-за этого для стабильной работы игре не хватает даже достаточно мощного оборудования, а приложение может экстренно закрываться.

Читать далее
Total votes 12: ↑12 and ↓0+12
Comments19

Вебинар «Разработка встраиваемых систем с помощью модельно-ориентированного проектирования»

Reading time2 min
Views993

Всем привет!

На этом вебинаре расскажем:

- Как генерировать высококачественный и оптимизированный C/C++ код из моделей Simulink для использования в серийных системах

- Как осуществлять сборку, профилирование и верификацию сгенерированного кода на целевых процессорах на примере процессора компании Миландр

 → Регистрация и подробное описание

Читать далее
Total votes 4: ↑2 and ↓20
Comments0

Избавление от «мертвого» кода в Javascript в IE9

Reading time3 min
Views2.8K
[От переводчика: данный перевод является частью этого официального поста из блога команды IE и призван разъяснить недавнее недоразумение: IE9 — Обман при прохождении SunSpider JS? ]

Одним из изменений в нашем новом JavaScript движке, под кодовым названием Chakra, является уничтожение мертвого кода, с целью повышения производительности работы реальных сайтов. Вчера после полудня кто-то запостил вопрос у нас на коннекте — «What sorts of code does the analysis work on, other than the exact [math-cordic test] function included in SunSpider». Так как многих заинтересовал этот вопрос, то этот блог пост призван ответить на него.
Читать дальше →
Total votes 71: ↑52 and ↓19+33
Comments167

Компиляция. 8: оптимизация

Reading time15 min
Views3.2K
После приятного отдыха продолжаем писать компилятор для нашего джей-скрипа.
В предыдущем посте реализовали взятую с потолка эвристику для назначения регистров, и заодно начали оптимизировать код. А ещё перед этим читатели обнаружили баг в реализации присваивания.

Далее в посте:

  1. Починка бага
  2. Чистка копирований
  3. Что получилось?
  4. Сворачивание констант
  5. Реализация
Читать дальше →
Total votes 43: ↑41 and ↓2+39
Comments6

Ускорение кода на Python средствами самого языка

Reading time5 min
Views81K
Каким бы хорошим не был Python, есть у него проблема известная все разработчикам — скорость. На эту тему было написано множество статей, в том числе и на Хабре.

Что с этим можно сделать?
Total votes 98: ↑86 and ↓12+74
Comments46

5 способов сравнить два байтовых массива. Сравнительное тестирование

Reading time32 min
Views49K
секундомерВ результате профилирования моей софтины я сделал вывод о необходимости оптимизации функции сравнения буферов.
Т.к. CLR не предоставляет стандартного способа сравнить два куска памяти, то функция была написан на скорую руку самостоятельно (лишь бы работало).
Погуглив по фразе «Best Way to Compare Byte Arrays in .Net», я пришёл в замешательство: в абсолютном большинстве случаев люди предлагали использовать либо LINQ, либо Enumerable.SequenceEqual(), что практически одно и тоже. Даже на StackOverflow это был самый популярный ответ. Т.е. катастрофически популярно заблуждение вида:

«Compiler\run-time environment will optimize your loop so you don't need to worry about performance.» Отсюда.

Именно оно впервые навело меня на мысль написать этот пост.
Я провёл сравнительное тестирование пяти способов сравнения буферов, доступных из C#, и на основании результатов тестирования дал рекомендации в выборе способа.
Кроме того, я декомпилировал некоторые функции, и проанализировал код, генерируемый JIT-компилятором для конфигурации x86, а так же сравнил машинный код, генерируемый JIT-компилятором, с машинным кодом функции CRT аналогичного назначения.
Читать дальше →
Total votes 71: ↑67 and ↓4+63
Comments83

Городские легенды о медленных вызовах виртуальных функций

Reading time7 min
Views31K
Традиционно компиляторы реализуют вызовы виртуальных функций через двойную косвенную адресацию — если класс содержит хотя бы одну виртуальную функцию, то в начале каждого объекта этого класса хранится адрес таблицы виртуальных функций. Если компилятор не знает конкретный тип объекта, на который указывает указатель, то для вызова виртуальной функции нужно сначала взять указатель на объект, прочитать адрес начала таблицы, затем по номеру метода прочитать адрес, где хранится реализация функции, затем вызвать функцию.

Процесс поиска конкретной функции по указателю на объект называется поздним связыванием и выполняется во время работы программы. Позднее связывание не только увеличивает накладные расходы на вызов, но и препятствует оптимизации кода компилятором. Из-за этого сами виртуальные функции принято считать замедляющими работу.

В тексте выше ключевое слово «если». Что, если компилятор знает, какую функцию на самом деле надо вызывать?
Читать дальше →
Total votes 81: ↑78 and ↓3+75
Comments38

(Без)опасный copy elision

Reading time16 min
Views13K


Уже год в свободное от работы время я пилю что-то вроде смеси Maven и Spring для С++. Важной её частью является самописная система умных указателей. Зачем мне всё это — отдельная тема. В данной статье я хочу коротко рассказать о том, как одна, казалось бы, полезная фича С++ заставила меня усомниться в здравом смысле Стандарта.

Редактировано:
Приношу свои извинения хабрасообществу и Стандарту. Буквально на следующий день после отправки статьи осознал грубую ошибку в своих размышлениях. Лучше читать сразу конец статьи… и, да, к copy elision, выходит, статья относиться лишь косвенно.

Читать дальше →
Total votes 35: ↑24 and ↓11+13
Comments12

Ключевое слово volatile и атаки по времени

Reading time6 min
Views19K
Такие часы плохо подходят для атаки по времениВ библиотеке OpenSSL есть довольно любопытная функция с многообещающим именем CRYPTO_memcmp(). Комментарии к ней объясняют, что обычная memcmp() обладает фатальным недостатком – время ее работы зависит не только от размера сравниваемых блоков, но и от их содержимого, а это может помочь атакующему осуществить так называемую атаку по времени.

Аналогичные функции есть в ряде других проектов — поиск по запросу constant time memcmp дает несколько тысяч результатов.

Не будем подвергать сомнению необходимость использования функции CRYPTO_memcmp(), а вместо этого рассмотрим, решает ли она поставленную ей задачу.
Читать дальше →
Total votes 80: ↑74 and ↓6+68
Comments21

Новые оптимизации с использованием неопределенного поведения в gcc 4.9.0

Reading time3 min
Views16K
Отличные новости ждут пользователей gcc при переходе на версию 4.9.0 – новые оптимизации с использованием неопределенного поведения могут «сломать» (на самом деле — доломать) существующий код, который, например, сравнивает с нулем указатели, ранее переданные в memmove() и ряд других функций стандартной библиотеки.

Например, утверждается, что в таком коде:
int wtf( int* to, int* from, size_t count ) {
    memmove( to, from, count );
    if( from != 0 )
        return *from;
    return 0;
}

новый gcc может удалить сравнение указателя с нулем и в результате вызов wtf( 0, 0, 0 ) будет приводить к разыменованию нулевого указателя (и аварийному завершению программы).
Читать дальше →
Total votes 65: ↑64 and ↓1+63
Comments27

Автоматизируем сборку системы

Reading time18 min
Views10K
Петр Лухин

Большинство людей, впервые узнающих об автоматической сборке, вероятно, относятся к ней с осторожностью: избыточные трудозатраты на ее организацию и поддержание работоспособности вполне реальны, взамен же им предлагается лишь призрачное улучшение эффективности разработки в будущем. Кто же не понаслышке с ней знаком – более оптимистичны, поскольку знают: ряда проблем при работе с их системой гораздо проще избежать, пока они еще не сформировались, нежели когда становится уже поздно все менять.

Так чем же таким может быть интересна автоматическая сборка, какие возможности можно реализовать с ее помощью и каких результатов достичь? Попробуем разобраться.


Читать дальше →
Total votes 15: ↑9 and ↓6+3
Comments0

Векторизация циклов: диагностика и контроль

Reading time5 min
Views19K
Часто программисты полагаются на компилятор в вопросе векторизации циклов. Но компилятор не всесилен, ему зачастую тоже требуется помощь при разборе трудных участков. В данной статье есть ответ на вопрос: как узнать, где компилятор испытывает сложности с векторизацией и как помочь ему их преодолеть?
Разговор будет вестись про clang 3.5
Total votes 32: ↑32 and ↓0+32
Comments17

Приемы использования масочных регистров в AVX512 коде

Reading time14 min
Views11K
В процессорах компании Intel на смену AVX2 приходит новый набор инструкций AVX512, в котором появилась концепция масочных регистров. Автор этой статьи уже несколько лет занимается разработкой версии библиотеки Intel Integrated Performance Primitives, оптимизированной для AVX512, и накопил довольно большой опыт использования AVX512 инструкций с масками, который было решено объединить в одну отдельную статью, поскольку само использование таких инструкций с масками позволяет упростить и ускорить код в дополнение к ускорению от двукратного увеличения ширины регистров.
далее несколько примеров использования AVX512 инструкций с масками
Total votes 19: ↑19 and ↓0+19
Comments14

Новые возможности Safari 9 в iOS 9 и Mac OS X

Reading time6 min
Views17K
C релизом iPhone 6s, iOS9, OS X 10.11 El Capitan и даже watchOS 2 у веб-разработчиков появилось возможность попробовать новые функции в Safari 9. Далее подробно разберем их в нашей статье.

CSS


Поддержка фонового фильтра (backdrop-filter)


Это свойство определенно в Filter Effect Level 2, позволяет применять фильтры к фону (backdrop) элемента, а не к его фону (background). Можно создавать полупрозрачный фон, например для меню на фоновом изображении. Текст хорошо читается и выглядит эффектно, как в iOS.

Фоновый фильтр
Читать дальше →
Total votes 23: ↑22 and ↓1+21
Comments18

Минификация проекта, созданного в Blocs 1.5.2, с помощью Gulp

Reading time5 min
Views12K


Не так давно узнал о новом для себя инструменте построения сайтов на Bootstrap — Blocs. На хабре не нашел о нем информацию, поэтому позволю себе немного маркетинговых заметок, так как этот инструмент облегчил мне работу.

Blocs ориентирован на простоту, этот инструмент приносит свежий взгляд к созданию современных, высококачественных веб-сайтов, без необходимости понимать или писать код.

Blocs позиционирует себя как конструктор, который позволяет генерировать код, чистота и качество которого не уступает работе профессионального верстальщика.

Blocs работает как десктопное приложение под операционной системой Mac OS X, и не ограничивает вас количеством создаваемых сайтов, как это делают онлайн-конструкторы.

Blocs на лету делает верстку адаптивной (не всегда, правда, качественно, но так как код читабельный и чистый, легко поправить), также он поддерживает Retina.

Больше о Blocs на официальном сайте. Доступен триал 5 дней.
Программа простая, поэтому этого триала достаточно.
Читать дальше →
Total votes 15: ↑11 and ↓4+7
Comments9

Смешиваем цвета правильно или оптимизируем AlphaBlend

Reading time8 min
Views16K
Я пишу мультипротокольный (но не мультиплатформенный, увы, сейчас только windows) мессенджер, который пока что поддерживает только протокол TOX. Но речь не о мессенджере, а о его интерфейсе, а если точнее, об основной его функции — AlphaBlend. Да, я решил написать свой велосипед GUI. Ну а какой современный GUI без полупрозрачных элементов и плавных закруглений? Поэтому остро встала необходимость смешивать изображения с учетом полупрозрачности, т.е. альфа-смешивание или alpha blending. К счастью, в windows GDI такая функция имеется — AlphaBlend. Работает как надо, делает то что нужно. Но я тот еще строитель велосипедов, и мне стало интересно, смогу ли я написать такую же функцию, но более быструю. Результат моих трудов под катом.
Под капотом альфа смешивания
Total votes 19: ↑16 and ↓3+13
Comments21

Так ли нужно избавляться от ветвлений? — На примере sign, abs, min и max

Reading time6 min
Views15K
Я бы хотел предложить сообществу поучаствовать в пробном эксперименте. Суть его состоит в том, чтобы прогнать на своём компьютере программу, написанную на C++, и поделиться результатом измерения времени, которое она выдаёт, сравнивая скорость работы функций sign(x), abs(x), min(a,b) и max(a,b) в исполнении с ветвлением и без него. В статье я объясню свою мотивацию, покажу сами функции, а в конце предложу условия участия в эксперименте и его (увы) ограничения.
Читать дальше →
Total votes 25: ↑19 and ↓6+13
Comments144

Объяснение эксперимента о ветвлениях, или философские изыскания на тему бенчмарков в вакууме и в… реальности

Reading time11 min
Views7.1K
Надеюсь, кто хотел, ознакомился с моим пробным экспериментом на Хабре в этой статье. Теперь я считаю, что будет правильным огласить его результаты и даже дать более детальное объяснения причин, по которым вообще подобные эксперименты проводятся. Пост будет наполовину философским, поскольку сейчас в компьютерном мире всё настолько сложно, что без философского осмысления принять какие-то осмысленные решения просто невозможно. Я постараюсь вообще выразить своё мнение о сферических измерениях в вакууме, поэтому будет много букв. В статье есть опрос, проводимый до 1-го мая 2016. Под катом целиком ИМХО.

Читать дальше →
Total votes 13: ↑10 and ↓3+7
Comments12

C/C++: как измерять процессорное время

Reading time10 min
Views79K

image
КДПВ


От переводчика:
Большинство моих знакомых для измерения времени в разного вида бенчмарках в С++ используют chrono или, в особо запущенных случаях, ctime. Но для бенчмаркинга гораздо полезнее замерять процессорное время. Недавно я наткнулся на статью о кроссплатформенном замере процессорного времени и решил поделиться ею тут, возможно несколько увеличив качество местных бенчмарков.


P.S. Когда в статье написано "сегодня" или "сейчас", имеется ввиду "на момент выхода статьи", то есть, если я не ошибаюсь, март 2012. Ни я, ни автор не гарантируем, что это до сих пор так.
P.P.S. На момент публикации оригинал недоступен, но хранится в кэше Яндекса


Функции API, позволяющие получить процессорное время, использованное процессом, отличаются в разных операционных системах: Windows, Linux, OSX, BSD, Solaris, а также прочих UNIX-подобных ОС. Эта статья предоставляет кросс-платформенную функцию, получающую процессорное время процесса и объясняет, какие функции поддерживает каждая ОС.

Читать дальше →
Total votes 32: ↑29 and ↓3+26
Comments69

Как разравнять Пирамиду смерти

Reading time5 min
Views18K
Настроить webpack по мануалу, запрограммировать ангуляр и даже послать json по ajax — кажись каждый может, но вот как взглянешь на сам код… В этом посте будет показана разница между нововведениями.

Итак вы открыли ноду и увидели, что почти все функции «из коробки» последним аргументом принимают колбэк.

var fs = require("fs");
fs.readdir(__dirname, function(error, files) {
    if (error) {
        console.error(error);
    } else {
        for (var i = 0, j = files.length; i < j; i++) {
            console.log(files[i]);
        }
    }
});


Пирамида смерти
далее
Total votes 24: ↑21 and ↓3+18
Comments45
1
23 ...