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

Skia — это библиотека 2D-графики с открытым исходным кодом, которая предоставляет функции обработки графики, такие как контуры, текст, изображения и рендеринг. Первоначально он был разработан компанией Skia Inc., которая позже была приобретена Google, и используется в нескольких продуктах Google, включая браузер Chrome и операционную систему Android. Студенты, занимающиеся разработкой систем Android, должны быть знакомы со Skia. Skia небольшая и эффективная система, предоставляет богатый набор API-интерфейсов, поддерживает несколько архитектур ЦП и рендеринг с ускорением на графическом процессоре, а также поддерживает Windows, Linux, Mac OS, Android и другие операционные системы. Он кроссплатформенный. Идеально подходит для разработки графических приложений, широко используется в мобильных приложениях, играх и профессиональных инструментах графического дизайна.

Раньше Skia использовалась в системе Android. Недавно из-за требований проекта возникла необходимость использовать Skia в Windows для обработки графики, поэтому я скомпилировал графическую библиотеку Skia под Windows согласно документации.

В официальной документации Skia есть такое предложение:

Skia uses generated code that is only optimized when Skia is built with clang. Other compilers get generic unoptimized code.

Я начал не соглашаться, когда увидел такое предложение. Подумайте, насколько большой может быть разница в оптимизации компилятора? Кроме того, метод компиляции, впервые представленный чиновником, также использует Visual Studio 2017 или Visual Studio 2019. При разработке C++ под Windows программисты в первую очередь должны думать о Visual C++ от Microsoft (с ним когда-то конкурировал C++ Builder от Borland). Хотя в проекте используется Qt, под Windows по-прежнему используется компилятор MSVC. Поэтому, недолго думая, я решил использовать компилятор Visual C++ для компиляции Skia.

Следуйте инструкциям в документе, чтобы загрузить исходный код Skia, выберите ветку Chrome/m122, а затем загрузите сторонние библиотеки, инструменты и т. д., которые здесь не будут обсуждаться. Последний шаг — скомпилировать Skia. Как упоминалось ранее, Skia поддерживает несколько архитектур ЦП и несколько методов рендеринга с ускорением графического процессора, поэтому он поддерживает несколько параметров компиляции. Skia использует систему сборки gn, которая предоставляет большое количество параметров для поддержки различных операционных систем, компиляторов и различных индивидуальных настроек. Например, размер библиотеки Skia.lib, которую я скомпилировал вначале, составлял более 500 МБ. Наконец, после настройки некоторых параметров, размер скомпилированной библиотеки Skia.lib составил всего более 20 МБ. Вот параметры, которые я наконец использовал для компиляции Skia с помощью компилятора MSVC:

bin\gn gen out\Release_msvc --args="extra_cflags=["/MT"] win_sdk="C:\Program Files (x86)\Windows Kits\10" win_sdk_version="10.0.20348.0" win_vc="c:\Program Files\Microsoft Visual Studio\2022\Community\VC" is_debug=false is_official_build=true skia_use_system_expat=false skia_use_system_libjpeg_turbo=false skia_use_system_libpng=false skia_use_system_libwebp=false skia_use_system_zlib=false skia_use_system_harfbuzz=false skia_use_system_icu=false skia_enable_skparagraph=true skia_enable_skshaper=true skia_enable_skunicode=true

в:

win_sdk: если пакет SDK для Windows не установлен в расположении по умолчанию, необходимо указать этот параметр. win_sdk_version: если не указано, будет использоваться самая последняя версия. win_vc: если Visual Studio не установлена ​​в расположении по умолчанию. вам необходимо указать этот параметр is_official_build: Обычно выбирайте false. Если вы компилируете только саму библиотеку Skia, вы можете выбрать true, но такие библиотеки, как jpeg и png, необходимо подготовить заранее. is_comComponent_build: false компилируется в статическую библиотеку. правда, скомпилировано в динамическую библиотеку

Используйте скомпилированный Skia и программное обеспечение с открытым исходным кодом https://github.com/xland/ScreenCapture для его тестирования. Обнаружено серьезные проблемы с производительностью и очевидная задержка в движении мыши. Однако двоичный файл выпущен. с этим программным обеспечением все гладко.

Первое подозрение состоит в том, что Skia не включает ускорение GPU, а добавление Skia_use_gl=true включает ускорение OpenGL, но улучшений нет. Позже я посмотрел исходный код этого проекта и обнаружил, что ускорение графического процессора не включено.

Затем я попробовал настроить параметры компиляции Skia, но безрезультатно.

Не было никакой возможности, поэтому я спросил автора с намерением попробовать. Я оставил сообщение в разделе обсуждения проекта на github и спросил автора, как скомпилировать Skia. Неожиданно автор быстро ответил:

После ответа я скачал компилятор clang и использовал следующие параметры компиляции:

bin\gn gen out\release_clang --args="clang_win="D:\sdk\clang+llvm-18.1.6-x86_64-pc-windows-msvc" clang_win_version="18" cc="clang" cxx="clang++" extra_cflags=["/MT"] is_debug=false is_official_build=true skia_use_system_expat=false skia_use_system_libjpeg_turbo=false skia_use_system_libpng=false skia_use_system_libwebp=false skia_use_system_zlib=false skia_use_system_harfbuzz=false skia_use_system_icu=false skia_enable_skparagraph=true skia_enable_skshaper=true skia_enable_skunicode=true"

Затем скомпилируйте исходный код ScreenCapture. Конечно же, программа стала намного более плавной. Еще раз спасибо xland, автору проекта с открытым исходным кодом ScreenCapture.

Компьютерное оборудование быстро развивается. Например, процессор Intel Core перешел в 14-е поколение, а стандартная память современных компьютеров обычно начинается с 16 ГБ. Несмотря на это, хотя скорость работы современных компьютеров в сотни раз выше, чем десять лет назад, пользовательский опыт, похоже, существенно не улучшился. Этот феномен можно объяснить ранним законом Энди-Бера, который раскрывает противоречие между обновлениями аппаратного обеспечения и требованиями к программному обеспечению: улучшения производительности аппаратного обеспечения часто быстро поглощаются новыми требованиями к программному обеспечению.

Закон Энди и Билла представляет собой краткое изложение взаимосвязи между обновлениями программного и аппаратного обеспечения в ИТ-индустрии. Оригинальные слова: «Энди дает, Билл забирает. (То, что Энди дает, Билл забирает.)» Энди относится к бывшему генеральному директору Intel Энди Гроуву, а Билл относится к бывшему генеральному директору Microsoft Биллу Гейтсу. Это означает, что производительность, улучшенная аппаратным обеспечением, быстро расходуется программным обеспечением.

Это справедливо не только для операционной системы Windows, но и для прикладного программного обеспечения. Хотя новое программное обеспечение более мощное, чем предыдущая версия, добавленная функциональность определенно не пропорциональна его размеру. Сегодня любое программное обеспечение требует сотен мегабайт или даже нескольких гигабайт.

Когда современные программисты разрабатывают программное обеспечение, они не пишут его с нуля на C/C++ и редко задумываются о производительности. Вместо этого они используют множество фреймворков и объединяют множество промежуточных уровней, что, конечно, приводит к тому, что программное обеспечение становится все больше и больше. Конечно, с точки зрения ремонтопригодности и скорости разработки в этой модели разработки нет ничего плохого. Современное программное обеспечение становится все более сложным и должно удовлетворять все больше и больше потребностей. Это нереально, если все оно будет написано на C/C++. Таким образом, текущая общая модель такова, что бизнес-уровень написан с использованием языков быстрой разработки, таких как Java, Python и JS, а основные функции и высокопроизводительные компоненты по-прежнему пишутся на C/C++. В области ИИ, хотя язык Python и занимает заслуженное первое место, ядро ​​фреймворка ИИ в основном использует C/C++.

Не стоит переоценивать оптимизацию программного обеспечения. В конце концов, в области разработки программного обеспечения есть девиз:

Преждевременная оптимизация — худшее из зол.

Предложение «Преждевременная оптимизация — корень всех зол» изначально было предложено учёным-компьютерщиком Дональдом Кнутом. Полное утверждение звучит так: «Преждевременная оптимизация — корень всех зол». В этом предложении подчеркивается, что в процессе разработки программного обеспечения преждевременная оптимизация может привести к увеличению сложности кода, снижению его читаемости и удобства сопровождения, а зачастую слепая оптимизация может привести к потере большого количества денег, прежде чем будут поняты реальные узкие места системы.

  • Разработчики могут существовать в требованиях к проекту, а узкие места системы пока не ясны.,Просто начните работать над кодом. В этом случае,оптимизация часто основана на предположениях, а не на фактических данных.,Это может привести к отклонению работы от того направления, в котором улучшение действительно необходимо.
  • Преждевременное программирование может сделать код сложным и трудным для понимания, что затруднит последующее обслуживание и итерацию.
  • С точки зрения затрат это также может потребовать много времени и ресурсов, и эти инвестиции могут оказаться нерентабельными на ранних стадиях проекта.

Что касается оптимизации программного обеспечения, ИИ дает следующие предложения:

  1. на основепроизводительностьанализироватьоптимизация:существоватьруководитьоптимизация До,Используйте инструмент анализа производительности, чтобы определить фактические узкие места вашей системы. только на основе реальных данныхоптимизация,Это эффективно и необходимо.
  2. Пошаговая оптимизация: существуют разработки проектов на ранних стадиях,Можете сосредоточиться на корректности и функциональной полноте кода. После того, как функция стабилизируется,Затем действуйте шаг за шагом в соответствии с фактическими потребностями.
  3. Сохраняйте код читабельным и кратким: оптимизация не должна осуществляться за счет удобочитаемости и удобства сопровождения кода. Ясный и лаконичный код легче понять и поддерживать.
  4. Приоритет: приоритет будет отдан проблемам, которые влияют на взаимодействие с пользователем.,Например, время загрузки, скорость ответа и т. д. Для внутренней обработки,Если это может удовлетворить потребности бизнеса,При необходимости его можно отложить.
  5. Используйте зрелые инструменты и библиотеки: воспользуйтесь преимуществами оптимизации сторонних библиотек и инструментов, которые были протестированы.,Не изобретайте велосипед,В то же время используйте силу сообщества для повышения производительности программного обеспечения.

Я правда не ожидал, что компилятор так сильно влияет на производительность. А вы на работе проводите оптимизацию производительности? Какие меры оптимизации существуют? Добро пожаловать, чтобы оставить сообщение для обсуждения.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose