Измерение производительности функции в тесте
Привет, Flutter-разработчики! 👋 Сегодня мы поделимся с вами полезным советом о том, как измерить производительность функции внутри теста. 🔍
Зачем это нужно?
- Оптимизация производительности вашего приложения 🔝
- Выявление узких мест в коде 🔎
- Улучшение пользовательского опыта 👥
Пример кода:
Что здесь происходит? 🤔
1. Мы запускаем тест виджета с помощью `testWidgets`.
2. Запускаем секундомер (`Stopwatch`) перед выполнением тестируемой функции.
3. Выполняем необходимые действия (в данном случае тап по кнопке с ключом 'btn').
4. Проверяем, что общее время выполнения не превышает заданный порог (500 мс).
👍 Оцените эту рубрику и напишите в комментариях, какие темы вас интересуют! 💬
Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #FlutterTips #MobileDev #PerformanceOptimization #TestingInFlutter
Привет, Flutter-разработчики! 👋 Сегодня мы поделимся с вами полезным советом о том, как измерить производительность функции внутри теста. 🔍
Зачем это нужно?
- Оптимизация производительности вашего приложения 🔝
- Выявление узких мест в коде 🔎
- Улучшение пользовательского опыта 👥
Пример кода:
testWidgets('проверка производительности большой функции', (
WidgetTester tester,
) async {
// Запускаем секундомер
final sw = Stopwatch()..start();
await tester.tap(find.byKey(const ValueKey('btn')));
await tester.pumpAndSettle(const Duration(milliseconds: 100));
// Проверяем, что прошедшее время меньше 500 мс
expect(sw.elapsedMilliseconds, lessThan(500));
});
Что здесь происходит? 🤔
1. Мы запускаем тест виджета с помощью `testWidgets`.
2. Запускаем секундомер (`Stopwatch`) перед выполнением тестируемой функции.
3. Выполняем необходимые действия (в данном случае тап по кнопке с ключом 'btn').
4. Проверяем, что общее время выполнения не превышает заданный порог (500 мс).
👍 Оцените эту рубрику и напишите в комментариях, какие темы вас интересуют! 💬
Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #FlutterTips #MobileDev #PerformanceOptimization #TestingInFlutter
❤1
Оптимизация интерфейса Flutter с помощью RepaintBoundary
🚀 Хотите, чтобы ваше приложение на Flutter работало плавно и быстро? 🤔 Тогда вам нужно знать о виджете
Основная часть: в статье рассматривается виджет RepaintBoundary, который помогает изолировать части интерфейса от ненужных перерисовок, улучшая производительность и эффективность приложения. Вы узнаете, как и когда использовать
🇷🇺 Читать статью на русском
🇬🇧 Read the article in English
🌐 Original article
Все подобные новости ищите по хэштегу #FlutterPulseMedium ✨ Напишите, понравилась ли вам новая рубрика! 👍
#flutter #dart #flutterpulse #FlutterPulseMedium #mobiledevelopment #appoptimization #ui #ux #performanceoptimization
🚀 Хотите, чтобы ваше приложение на Flutter работало плавно и быстро? 🤔 Тогда вам нужно знать о виджете
RepaintBoundary!Основная часть: в статье рассматривается виджет RepaintBoundary, который помогает изолировать части интерфейса от ненужных перерисовок, улучшая производительность и эффективность приложения. Вы узнаете, как и когда использовать
RepaintBoundary, чтобы оптимизировать сложные UI-компоненты, предотвратить "дерганый" интерфейс и повысить скорость отрисовки анимаций. 📈 Также в статье приведены примеры использования RepaintBoundary с AnimatedBuilder и Image.network, а также советы по измерению производительности с помощью Flutter DevTools и debugRepaintRainbowEnabled. 🔍🇷🇺 Читать статью на русском
🇬🇧 Read the article in English
🌐 Original article
Все подобные новости ищите по хэштегу #FlutterPulseMedium ✨ Напишите, понравилась ли вам новая рубрика! 👍
#flutter #dart #flutterpulse #FlutterPulseMedium #mobiledevelopment #appoptimization #ui #ux #performanceoptimization
Как Flutter работает на нескольких платформах: разбираем архитектурные слои
Вы когда-нибудь задумывались, как Flutter позволяет запускать один и тот же код на разных платформах? 🤔
В этой статье мы погрузимся в детали архитектуры Flutter и узнаем, как она обеспечивает бесперебойную работу приложений на Android, iOS, Web и Desktop без необходимости переписывать код для каждой платформы. 📱💻
Статья рассказывает о трёх основных слоях Flutter: Flutter Framework, Flutter Engine и Platform Embedder. Вы узнаете, как они взаимодействуют между собой, обеспечивая высокую производительность и native-подобный опыт. 🚀
Flutter Framework — это верхний слой, где разработчики пишут код на Dart и используют готовые компоненты для создания красивых и отзывчивых интерфейсов. 🌟
Flutter Engine — это сердце Flutter, написанное на C++ и отвечающее за рендеринг UI, обработку анимаций и управление Dart runtime. 💻
Platform Embedder — это нижний слой, который взаимодействует с операционной системой и аппаратным обеспечением устройства, обеспечивая интеграцию Flutter с native-кодом. 📈
В статье также рассматриваются такие темы, как управление состоянием, анимации, gesture recognition и компиляция Dart-кода. 🎯
🇷🇺 Читать на русском
🇬🇧 Read in English
🌐 Original article
Все подобные новости ищите по хэштегу #FlutterPulseMedium ✨ Напишите, понравилась ли вам новая рубрика! 🤔
#flutter #dart #flutterpulse #FlutterPulseMedium #crossplatform #appdevelopment #mobiledevelopment #uiux #performanceoptimization
Вы когда-нибудь задумывались, как Flutter позволяет запускать один и тот же код на разных платформах? 🤔
В этой статье мы погрузимся в детали архитектуры Flutter и узнаем, как она обеспечивает бесперебойную работу приложений на Android, iOS, Web и Desktop без необходимости переписывать код для каждой платформы. 📱💻
Статья рассказывает о трёх основных слоях Flutter: Flutter Framework, Flutter Engine и Platform Embedder. Вы узнаете, как они взаимодействуют между собой, обеспечивая высокую производительность и native-подобный опыт. 🚀
Flutter Framework — это верхний слой, где разработчики пишут код на Dart и используют готовые компоненты для создания красивых и отзывчивых интерфейсов. 🌟
Flutter Engine — это сердце Flutter, написанное на C++ и отвечающее за рендеринг UI, обработку анимаций и управление Dart runtime. 💻
Platform Embedder — это нижний слой, который взаимодействует с операционной системой и аппаратным обеспечением устройства, обеспечивая интеграцию Flutter с native-кодом. 📈
В статье также рассматриваются такие темы, как управление состоянием, анимации, gesture recognition и компиляция Dart-кода. 🎯
🇷🇺 Читать на русском
🇬🇧 Read in English
🌐 Original article
Все подобные новости ищите по хэштегу #FlutterPulseMedium ✨ Напишите, понравилась ли вам новая рубрика! 🤔
#flutter #dart #flutterpulse #FlutterPulseMedium #crossplatform #appdevelopment #mobiledevelopment #uiux #performanceoptimization
Обработка в фоне в приложениях Flutter: подробный разбор 💻
Flutter-разработчики, вы когда-нибудь задумывались, как улучшить производительность вашего приложения, выполняя ресурсоёмкие задачи в фоне? 🤔
В этой статье мы погрузимся в мир обработки в фоне в приложениях Flutter и рассмотрим различные подходы к реализации фоновых задач. Вы узнаете о таких приёмах, как использование Isolates, compute-функций, Background Services и WorkManager, а также о платформо-зависимой обработке и лучших практиках для оптимизации производительности и обработки ошибок. 📊
В статье будут рассмотрены следующие темы:
- Использование Isolates для CPU-интенсивных задач
- Реализация Background Services для длительных операций
- Применение WorkManager для запланированных задач
- Платформо-зависимая обработка в фоне
- Мониторинг и оптимизация производительности
- Обработка ошибок в фоновых задачах
Читаем подробности и улучшаем наши приложения! 📖
🇷🇺Обработка в фоне в приложениях Flutter: подробный разбор
🇬🇧Background Processing in Flutter Applications: A Deep Dive
🌐Оригинальная статья
Все подобные новости ищите по хэштегу #FlutterPulseMedium ✨ Напишите, понравилась ли вам новая рубрика!
#flutter #dart #flutterpulse #FlutterPulseMedium #mobiledevelopment #appdevelopment #backgroundprocessing #performanceoptimization
Flutter-разработчики, вы когда-нибудь задумывались, как улучшить производительность вашего приложения, выполняя ресурсоёмкие задачи в фоне? 🤔
В этой статье мы погрузимся в мир обработки в фоне в приложениях Flutter и рассмотрим различные подходы к реализации фоновых задач. Вы узнаете о таких приёмах, как использование Isolates, compute-функций, Background Services и WorkManager, а также о платформо-зависимой обработке и лучших практиках для оптимизации производительности и обработки ошибок. 📊
В статье будут рассмотрены следующие темы:
- Использование Isolates для CPU-интенсивных задач
- Реализация Background Services для длительных операций
- Применение WorkManager для запланированных задач
- Платформо-зависимая обработка в фоне
- Мониторинг и оптимизация производительности
- Обработка ошибок в фоновых задачах
Читаем подробности и улучшаем наши приложения! 📖
🇷🇺Обработка в фоне в приложениях Flutter: подробный разбор
🇬🇧Background Processing in Flutter Applications: A Deep Dive
🌐Оригинальная статья
Все подобные новости ищите по хэштегу #FlutterPulseMedium ✨ Напишите, понравилась ли вам новая рубрика!
#flutter #dart #flutterpulse #FlutterPulseMedium #mobiledevelopment #appdevelopment #backgroundprocessing #performanceoptimization
Как работает сборщик мусора в Dart и когда он подводит?
🚨 Хотите писать эффективный и безошибочный код на Dart? 🤔 Тогда вам нужно знать, как работает сборщик мусора! 💻
В статье рассматривается работа сборщика мусора в Dart, его сильные стороны и потенциальные проблемы. Вы узнаете о генерационном подходе к сборке мусора, алгоритме mark-and-sweep и оптимизациях, используемых в Dart. 📚
Также в статье обсуждаются распространенные сценарии утечек памяти в Dart и Flutter, такие как не закрытые потоки и подписки, слушатели и замыкания. 🤯 Вы узнаете, как использовать
Переходите по ссылкам, чтобы узнать больше:
🇷🇺 Как работает сборщик мусора в Dart и когда он вас подводит!
🇬🇧 How Dart's Garbage Collector Works And When It Fails You
🌐 Оригинальная статья
Все подобные новости ищите по хэштегу #FlutterPulseMedium ✨ Оцените новую рубрику! 👍
#flutter #dart #flutterpulse #FlutterPulseMedium #memorymanagement #garbagecollection #performanceoptimization
🚨 Хотите писать эффективный и безошибочный код на Dart? 🤔 Тогда вам нужно знать, как работает сборщик мусора! 💻
В статье рассматривается работа сборщика мусора в Dart, его сильные стороны и потенциальные проблемы. Вы узнаете о генерационном подходе к сборке мусора, алгоритме mark-and-sweep и оптимизациях, используемых в Dart. 📚
Также в статье обсуждаются распространенные сценарии утечек памяти в Dart и Flutter, такие как не закрытые потоки и подписки, слушатели и замыкания. 🤯 Вы узнаете, как использовать
WeakReference и Finalizer, чтобы избежать утечек памяти. 💡Переходите по ссылкам, чтобы узнать больше:
🇷🇺 Как работает сборщик мусора в Dart и когда он вас подводит!
🇬🇧 How Dart's Garbage Collector Works And When It Fails You
🌐 Оригинальная статья
Все подобные новости ищите по хэштегу #FlutterPulseMedium ✨ Оцените новую рубрику! 👍
#flutter #dart #flutterpulse #FlutterPulseMedium #memorymanagement #garbagecollection #performanceoptimization
Ускорьте своё приложение Flutter: проверенные советы от разработчика!
Хотите сделать своё приложение Flutter быстрее и эффективнее? В этой статье вы найдёте реальные советы от опытного разработчика!
В статье рассматриваются практические стратегии улучшения скорости, памяти и пользовательского опыта в проектах Flutter. Автор делится своим опытом и рассказывает о том, как использовать инструменты профилирования, оптимизировать сетевые запросы и данные, избегать распространённых анти-паттернов производительности и балансировать функциональность с эффективностью ресурсов.
Вы узнаете, как:
- использовать профилирование для выявления проблем с производительностью;
- оптимизировать сетевые запросы и данные с помощью ленивой загрузки, кэширования и параллелизации запросов;
- избегать распространённых анти-паттернов производительности, таких как избыточные перестроения виджетов;
- балансировать функциональность с эффективностью ресурсов, используя кэширование, повторное использование виджетов и минимизацию ненужных анимаций.
🇷🇺 Читать статью на русском
🇬🇧 Read the article in English
🌐 Читать оригинал
Все подобные новости ищите по хэштегу #FlutterPulseMedium ✨ Напишите, понравилась ли вам эта рубрика!
FlutterPulse — канал о мире Flutter!
#flutter #dart #flutterpulse #FlutterPulseMedium #mobiledevelopment #performanceoptimization #appdevelopment
Хотите сделать своё приложение Flutter быстрее и эффективнее? В этой статье вы найдёте реальные советы от опытного разработчика!
В статье рассматриваются практические стратегии улучшения скорости, памяти и пользовательского опыта в проектах Flutter. Автор делится своим опытом и рассказывает о том, как использовать инструменты профилирования, оптимизировать сетевые запросы и данные, избегать распространённых анти-паттернов производительности и балансировать функциональность с эффективностью ресурсов.
Вы узнаете, как:
- использовать профилирование для выявления проблем с производительностью;
- оптимизировать сетевые запросы и данные с помощью ленивой загрузки, кэширования и параллелизации запросов;
- избегать распространённых анти-паттернов производительности, таких как избыточные перестроения виджетов;
- балансировать функциональность с эффективностью ресурсов, используя кэширование, повторное использование виджетов и минимизацию ненужных анимаций.
🇷🇺 Читать статью на русском
🇬🇧 Read the article in English
🌐 Читать оригинал
Все подобные новости ищите по хэштегу #FlutterPulseMedium ✨ Напишите, понравилась ли вам эта рубрика!
FlutterPulse — канал о мире Flutter!
#flutter #dart #flutterpulse #FlutterPulseMedium #mobiledevelopment #performanceoptimization #appdevelopment
👍1
Оптимизация запуска приложения Flutter: от холодного запуска до готовности за 2 секунды
Хотите, чтобы ваше приложение запускалось мгновенно и радовало пользователей? Оптимизация запуска - ключ к успеху!
В этой статье мы рассмотрим, как оптимизировать время запуска приложения Flutter, используя различные приёмы и техники. Вы узнаете, как минимизировать работу во время инициализации, загружать данные асинхронно, избегать тяжелых вычислений на главном потоке и использовать Deferred Loading для функций и ресурсов.
В статье описаны следующие техники оптимизации:
- минимизация работы во время инициализации приложения;
- асинхронная загрузка данных и ресурсов;
- использование isolates для тяжелых вычислений;
- оптимизация дерева виджетов;
- Deferred Loading для функций и ресурсов;
- стратегическое использование Splash Screen;
- измерение времени запуска и оптимизация размера приложения.
🇷🇺Читать статью на русском языке
🇬🇧Read the article in English
🌐Original article on Medium
Все подобные новости ищите по хэштегу #FlutterPulseMedium ✨ Напишите, понравилась ли вам новая рубрика!
FlutterPulse — канал о мире Flutter!
#flutter #dart #flutterpulse #FlutterPulseMedium #mobiledevelopment #appoptimization #performanceoptimization
Хотите, чтобы ваше приложение запускалось мгновенно и радовало пользователей? Оптимизация запуска - ключ к успеху!
В этой статье мы рассмотрим, как оптимизировать время запуска приложения Flutter, используя различные приёмы и техники. Вы узнаете, как минимизировать работу во время инициализации, загружать данные асинхронно, избегать тяжелых вычислений на главном потоке и использовать Deferred Loading для функций и ресурсов.
В статье описаны следующие техники оптимизации:
- минимизация работы во время инициализации приложения;
- асинхронная загрузка данных и ресурсов;
- использование isolates для тяжелых вычислений;
- оптимизация дерева виджетов;
- Deferred Loading для функций и ресурсов;
- стратегическое использование Splash Screen;
- измерение времени запуска и оптимизация размера приложения.
🇷🇺Читать статью на русском языке
🇬🇧Read the article in English
🌐Original article on Medium
Все подобные новости ищите по хэштегу #FlutterPulseMedium ✨ Напишите, понравилась ли вам новая рубрика!
FlutterPulse — канал о мире Flutter!
#flutter #dart #flutterpulse #FlutterPulseMedium #mobiledevelopment #appoptimization #performanceoptimization
👍2
Создание 1МБ Flutter приложения: миф или реальность?
Мечтаете о сверхлёгком приложении, но не знаете, с чего начать? Давайте разберёмся, возможно ли создать Flutter-приложение размером менее 1 МБ и какие приёмы оптимизации можно использовать.
В статье рассматривается жестокая правда о размере Flutter-приложений и объясняется, почему 1 МБ — это недостижимая цель. Вы узнаете, какой размер приложения считается "маленьким" в 2025 году, и какие стратегии оптимизации можно применить, чтобы уменьшить размер вашего приложения. В статье описаны такие приёмы, как использование Android App Bundles, включение shrinking в build.gradle, использование встроенного tree shaking в Flutter, оптимизация ресурсов и управление зависимостями.
Также в статье приведены реальные примеры оптимизации приложений и дан чек-лист для оптимизации размера Flutter-приложения.
🇷🇺 Читать статью на русском
🇬🇧 Read the article in English
🌐 Читать оригинал
Все подобные новости ищите по хэштегу #FlutterPulseMedium ✨ Напишите, чтобы подписчики оценили рубрику.
FlutterPulse — канал о мире Flutter!
#flutter #dart #flutterpulse #FlutterPulseMedium #appoptimization #mobiledevelopment #crossplatform #performanceoptimization
Мечтаете о сверхлёгком приложении, но не знаете, с чего начать? Давайте разберёмся, возможно ли создать Flutter-приложение размером менее 1 МБ и какие приёмы оптимизации можно использовать.
В статье рассматривается жестокая правда о размере Flutter-приложений и объясняется, почему 1 МБ — это недостижимая цель. Вы узнаете, какой размер приложения считается "маленьким" в 2025 году, и какие стратегии оптимизации можно применить, чтобы уменьшить размер вашего приложения. В статье описаны такие приёмы, как использование Android App Bundles, включение shrinking в build.gradle, использование встроенного tree shaking в Flutter, оптимизация ресурсов и управление зависимостями.
Также в статье приведены реальные примеры оптимизации приложений и дан чек-лист для оптимизации размера Flutter-приложения.
🇷🇺 Читать статью на русском
🇬🇧 Read the article in English
🌐 Читать оригинал
Все подобные новости ищите по хэштегу #FlutterPulseMedium ✨ Напишите, чтобы подписчики оценили рубрику.
FlutterPulse — канал о мире Flutter!
#flutter #dart #flutterpulse #FlutterPulseMedium #appoptimization #mobiledevelopment #crossplatform #performanceoptimization
👍1😁1
Три малоизвестных виджета Flutter, которые улучшат ваши приложения
Вы используете одни и те же виджеты снова и снова? Flutter предлагает множество инструментов, которые могут упростить разработку и улучшить производительность приложений.
В этой статье мы рассмотрим три малоизвестных виджета Flutter: GridPaper, TickerMode и RepaintBoundary. Они помогут вам с отладкой разметки, управлением анимациями и оптимизацией производительности.
🔹 GridPaper — виджет, который рисует настраиваемую сетку поверх вашего интерфейса, помогая проверять выравнивание и расстояние между элементами.
✅ TickerMode — позволяет включать или выключать анимации в определенной части дерева виджетов, что может улучшить производительность.
👉 RepaintBoundary — изолирует часть дерева виджетов в отдельный слой, уменьшая количество ненужных перерисовок и улучшая производительность.
Эти виджеты могут быть полезны в различных ситуациях, от отладки и оптимизации производительности до создания более сложных и интересных интерфейсов.
🇷🇺 Читать статью на русском
🇬🇧 Read the article in English
🌐 Читать оригинал
Все подобные новости ищите по хэштегу #FlutterPulseMedium ✨ Напишите, чтобы подписчики оценили рубрику.
FlutterPulse — канал о мире Flutter!
#flutter #dart #flutterpulse #FlutterPulseMedium #mobiledevelopment #appdevelopment #ui #ux #performanceoptimization
Вы используете одни и те же виджеты снова и снова? Flutter предлагает множество инструментов, которые могут упростить разработку и улучшить производительность приложений.
В этой статье мы рассмотрим три малоизвестных виджета Flutter: GridPaper, TickerMode и RepaintBoundary. Они помогут вам с отладкой разметки, управлением анимациями и оптимизацией производительности.
🔹 GridPaper — виджет, который рисует настраиваемую сетку поверх вашего интерфейса, помогая проверять выравнивание и расстояние между элементами.
✅ TickerMode — позволяет включать или выключать анимации в определенной части дерева виджетов, что может улучшить производительность.
👉 RepaintBoundary — изолирует часть дерева виджетов в отдельный слой, уменьшая количество ненужных перерисовок и улучшая производительность.
Эти виджеты могут быть полезны в различных ситуациях, от отладки и оптимизации производительности до создания более сложных и интересных интерфейсов.
🇷🇺 Читать статью на русском
🇬🇧 Read the article in English
🌐 Читать оригинал
Все подобные новости ищите по хэштегу #FlutterPulseMedium ✨ Напишите, чтобы подписчики оценили рубрику.
FlutterPulse — канал о мире Flutter!
#flutter #dart #flutterpulse #FlutterPulseMedium #mobiledevelopment #appdevelopment #ui #ux #performanceoptimization
Управление памятью и утечки памяти в Flutter: как избежать проблем
Flutter-разработчики, вы когда-нибудь задумывались, как работает управление памятью в вашем приложении? Утечки памяти могут стать настоящей проблемой, если не понимать, как они возникают и как их предотвратить.
В этой статье мы разберем основы управления памятью, расскажем о различиях между Stack и Heap памятью, а также о том, как возникают утечки памяти. Вы узнаете, как Dart Virtual Machine (VM) управляет памятью, и какие объекты могут стать причиной утечек.
✅ Основные темы статьи:
👉 Что такое управление памятью и как оно работает в Android и iOS
⚙️ Типы памяти: Stack и Heap
📌 Как возникают утечки памяти и как их предотвратить
✅ Примеры утечек памяти в Flutter, связанные с BuildContext и контроллерами
👉 Как использовать Flutter DevTools для обнаружения утечек памяти
В статье вы найдете практические советы и примеры, которые помогут вам написать более эффективный и безопасный код.
🇷🇺 Читать статью на русском
🇬🇧 Read the article in English
🌐 Читать оригинал
Все подобные новости ищите по хэштегу #FlutterPulseMedium ✨ Напишите, чтобы подписчики оценили рубрику.
FlutterPulse — канал о мире Flutter!
#flutter #dart #flutterpulse #FlutterPulseMedium #memoryleak #memorymanagement #performanceoptimization
Flutter-разработчики, вы когда-нибудь задумывались, как работает управление памятью в вашем приложении? Утечки памяти могут стать настоящей проблемой, если не понимать, как они возникают и как их предотвратить.
В этой статье мы разберем основы управления памятью, расскажем о различиях между Stack и Heap памятью, а также о том, как возникают утечки памяти. Вы узнаете, как Dart Virtual Machine (VM) управляет памятью, и какие объекты могут стать причиной утечек.
✅ Основные темы статьи:
👉 Что такое управление памятью и как оно работает в Android и iOS
⚙️ Типы памяти: Stack и Heap
📌 Как возникают утечки памяти и как их предотвратить
✅ Примеры утечек памяти в Flutter, связанные с BuildContext и контроллерами
👉 Как использовать Flutter DevTools для обнаружения утечек памяти
В статье вы найдете практические советы и примеры, которые помогут вам написать более эффективный и безопасный код.
🇷🇺 Читать статью на русском
🇬🇧 Read the article in English
🌐 Читать оригинал
Все подобные новости ищите по хэштегу #FlutterPulseMedium ✨ Напишите, чтобы подписчики оценили рубрику.
FlutterPulse — канал о мире Flutter!
#flutter #dart #flutterpulse #FlutterPulseMedium #memoryleak #memorymanagement #performanceoptimization