При использовании разных компиляторов для компиляции 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
Учебное пособие по Jetpack Compose для начинающих, базовые элементы управления и макет
boy illustration
Код js веб-страницы, фон частицы, код спецэффектов
boy illustration
【новый! Суперподробное】Полное руководство по свойствам компонентов Figma.
boy illustration
🎉Обязательно к прочтению новичкам: полное руководство по написанию мини-программ WeChat с использованием программного обеспечения Cursor.
boy illustration
[Забавный проект Docker] VoceChat — еще одно приложение для мгновенного чата (IM)! Может быть встроен в любую веб-страницу!
boy illustration
Как реализовать переход по странице в HTML (html переходит на указанную страницу)
boy illustration
Как решить проблему зависания и низкой скорости при установке зависимостей с помощью npm. Существуют ли доступные источники npm, которые могут решить эту проблему?
boy illustration
Серия From Zero to Fun: Uni-App WeChat Payment Practice WeChat авторизует вход в систему и украшает страницу заказа, создает интерфейс заказа и инициирует запрос заказа
boy illustration
Серия uni-app: uni.navigateЧтобы передать скачок значения
boy illustration
Апплет WeChat настраивает верхнюю панель навигации и адаптируется к различным моделям.
boy illustration
JS-время конвертации
boy illustration
Обеспечьте бесперебойную работу ChromeDriver 125: советы по решению проблемы chromedriver.exe не найдены
boy illustration
Поле комментария, щелчок мышью, специальные эффекты, js-код
boy illustration
Объект массива перемещения объекта JS
boy illustration
Как открыть разрешение на позиционирование апплета WeChat_Как использовать WeChat для определения местонахождения друзей
boy illustration
Я даю вам два набора из 18 простых в использовании фонов холста Power BI, так что вам больше не придется возиться с цветами!
boy illustration
Получить текущее время в js_Как динамически отображать дату и время в js
boy illustration
Вам необходимо изучить сочетания клавиш vsCode для форматирования и организации кода, чтобы вам больше не приходилось настраивать формат вручную.
boy illustration
У ChatGPT большое обновление. Всего за 45 минут пресс-конференция показывает, что OpenAI сделал еще один шаг вперед.
boy illustration
Copilot облачной разработки — упрощение разработки
boy illustration
Микросборка xChatGPT с низким кодом, создание апплета чат-бота с искусственным интеллектом за пять шагов
boy illustration
CUDA Out of Memory: идеальное решение проблемы нехватки памяти CUDA
boy illustration
Анализ кластеризации отдельных ячеек, который должен освоить каждый&MarkerгенетическийВизуализация
boy illustration
vLLM: мощный инструмент для ускорения вывода ИИ
boy illustration
CodeGeeX: мощный инструмент генерации кода искусственного интеллекта, который можно использовать бесплатно в дополнение к второму пилоту.
boy illustration
Машинное обучение Реальный бой LightGBM + настройка параметров случайного поиска: точность 96,67%
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция без кодирования и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
LM Studio для создания локальных больших моделей
boy illustration
Как определить количество слоев и нейронов скрытых слоев нейронной сети?
boy illustration
[Отслеживание целей] Подробное объяснение ByteTrack и детали кода