Не могли бы вы уточнить, какую конкретно задачу вы хотели ускорить с помощью WebAssembly? Из статьи я понял, что у вас две проблемы: декодер протобуф и вычисления. С вычислениями всё понятно — векторная алгебра на плюсах работает значительно быстрее, но вот с декодером протобуф есть сомнения. В итоге, результат в статье соответствует "средней температуре по больнице" — и хороший инструмент был выкинут.
По поводу большого размера. А вам действительно нужно всё то, что тянет за собой emscripten? Может в вашем случае достаточно сборки непосредственно с помощью CLang? Например так clang++ test.cpp -ObjC++ --compile --target=wasm32-unknown-unknown-wasm --optimize=3 --output test.wasm
На самом деле любой мало-мальски грамотный автоформаттер разделит это непотребство на более логичное i-- > 0 и нет тут никаких идиом. Зато есть очень полезное свойство для for
for(auto i = container.size(); i-- > 0;){}
Польза от auto здесь в том, что контейнер не обязательно из STL, a, например, из Qt, у которых .size() возвращает int.
Для квадратичной кривой Безье действительно можно и аналитически найти решение. Для более высоких порядков степень результанта растёт как n2. И если всё же заморочиться с поиском корней, то даже для кривой первого порядка аналитического решения может не быть, а пересечение с точностью до R имеется.
Вообще, тут надо искать минимум расстояния между кривыми |B(c1,t1)-B(c2,t2)|2. но это уж точно будет задача не из простых.
Разделить исходную кривую методом де Кастельжо, в пропорции t2, а потом первую из полученных частей — в пропорции t1/t2. Вторая кривая после второго разделения — искомая.
Вы имеете ввиду частный случай квадратичной кривой? Да это так. Для кривых более высокого порядка так не работает. Описанный в заметке метод работает для кривых любого порядка.
[[maybe_unused]] auto tmp = ((subscribers.HandleEvent(), 0) + ...) ;
Это хорошо, что никакой разницы, это правильно. Поэтому лучше без pass — кода меньше, а по поводу читаемости — в любом случае свёртка выглядит как минимум не привычно.
Скорее всего, компилятор исключит само действие с числами.
Эх, жаль что в MSVS 2017 этим не воспользоваться: "fatal error C1001: An internal error has occurred in the compiler."
Что-то слишком много различий Вы указали. Да, из существенных Livingstone тоньше, рамка меньше, он на 80 г легче, процессор мощнее — это п. п. 3, 6, 7. А вот с остальным я не полностью согласен. 1. Я конечно ШИМ на диодах не смотрел, но частота там явно больше 50 Гц. Нет там мерцания. Да, иногда странные кратковременные потемнения на некоторых светодиодах (такое подрагивание) было, но редко. Я это списывал на срыв ШИМ при минимальном уровне яркости. Не существенно. Если в Livingstone управление "постоянным током", то надо смотреть особенности, так как если без ШИМ, то будет нагрев и потери энергии. Он греется на минимальной/максимальной яркости? 2. Палитра. Хм, ок. Маркетинговый ход. А оно надо? Ну, так, побаловаться — это да. Но потом всё равно надо выбрать цвет минимально искажающий фон, чтобы днём (без подсветки) и ночью глаза не уставали. 3. и 9. спящий режим = разрядка. Чехол Newton тоже с магнитиками и при закрытии гаснет экран и книга выключится через указанное в настройках время. Выключение — это единственный надёжный способ сэкономить заряд. Лучше бы сделали быстрое включение. "Время автономной работы значительно увеличилось" — а можно поточнее, особенно в сравнении с прочими "линуксовыми" ридерами? 4. Ну, так-то там андроид и сортировка и фильтрация и настройки зависят от установленного приложения. Вы же не о том, что теперь стало ещё больше проблем с установкой не родного ПО? 5. Wi-Fi в Newton есть! Значит Bluetooth, хм, для передачи книг, хм, ну так себе задумка. Провод — быстрее, надёжней и безопасней. Заодно и подзарядиться можно. 7. и 8. Наверное это хорошо, но чем больше пикселей перерисовывать, тем больше потери заряда. Я не встречал читателей, которые устанавливали бы шрифт меньше 3 мм (не указываю в pt так как это будет связано с DPI экрана), поэтому стоит проверить, а есть ли реально выигрыш от увеличения DPI или лучше сделать рамку ещё тоньше?
«Шероховатости», говорите. Есть у меня ONYX BOOX Newton, и вот смотрю я на Livingstone и не вижу особой разницы для меня, как потребителя. Да, кнопки убрали — это хорошо, всё равно на экран жать лучше чем на кнопки (особенно ночью… все спят… Тишина… и ты такой — КЛАЦ!!! И начинаешь отбиваться от подушек и слушать всякое). Да, вроде как подсветка Livingstone на минимальных регулируется лучше (хотя не факт, надо проверить. У меня на минимуме и всё равно довольно ярко для ночи). Но вот что самое главное в книге, что отличает её от телефона? Время работы!
На моём Newton написано — 30 дней без подзарядки. Ха! Не держал и пары недель при чтении пару часов в день (ночь :) ). И это в первый год после покупки. А через 5 лет (всего!) работает только с внешним питанием. Причём тут Livingstone у него же аккумулятор в 2 раза больше? За-то и обвес стал больше — то есть избыточные mAh уйдут на что-то постороннее. Не берусь утверждать про качество самого аккумулятора, но есть сомнения.
Цена~качество, скажете. Не соглашусь, купленный ранее, чем мой Newton, примерно по той же цене и похожими характеристиками девайс другой фирмы работает до сих пор и для него 30 дней без подзарядки — это норма.
Не могли бы вы уточнить, какую конкретно задачу вы хотели ускорить с помощью WebAssembly? Из статьи я понял, что у вас две проблемы: декодер протобуф и вычисления. С вычислениями всё понятно — векторная алгебра на плюсах работает значительно быстрее, но вот с декодером протобуф есть сомнения. В итоге, результат в статье соответствует "средней температуре по больнице" — и хороший инструмент был выкинут.
По поводу большого размера. А вам действительно нужно всё то, что тянет за собой emscripten? Может в вашем случае достаточно сборки непосредственно с помощью CLang? Например так
clang++ test.cpp -ObjC++ --compile --target=wasm32-unknown-unknown-wasm --optimize=3 --output test.wasmНа самом деле любой мало-мальски грамотный автоформаттер разделит это непотребство на более логичное
i-- > 0и нет тут никаких идиом. Зато есть очень полезное свойство дляforПольза от
autoздесь в том, что контейнер не обязательно из STL, a, например, из Qt, у которых.size()возвращаетint.Для квадратичной кривой Безье действительно можно и аналитически найти решение. Для более высоких порядков степень результанта растёт как
n2. И если всё же заморочиться с поиском корней, то даже для кривой первого порядка аналитического решения может не быть, а пересечение с точностью доRимеется.Вообще, тут надо искать минимум расстояния между кривыми
|B(c1,t1)-B(c2,t2)|2. но это уж точно будет задача не из простых.Нет, самопересечения этот метод не ищет. Тогда бы пришлось писать метод сравнения кривой саму с собой.
Вы имеете ввиду частный случай квадратичной кривой? Да это так. Для кривых более высокого порядка так не работает. Описанный в заметке метод работает для кривых любого порядка.
Раз уж мы используем С++17, то лучше использовать [[maybe_unused]]
Это хорошо, что никакой разницы, это правильно. Поэтому лучше без
pass— кода меньше, а по поводу читаемости — в любом случае свёртка выглядит как минимум не привычно.да, предупреждение будет. Можно сделать так
char tmp = ((subscribers.HandleEvent(),0)+...);Интересно, это как-то повлияет на размер в ПЗУ?
В принципе от
pass()можно избавиться:Скорее всего, компилятор исключит само действие с числами.
Эх, жаль что в MSVS 2017 этим не воспользоваться: "fatal error C1001: An internal error has occurred in the compiler."
Что-то слишком много различий Вы указали. Да, из существенных Livingstone тоньше, рамка меньше, он на 80 г легче, процессор мощнее — это п. п. 3, 6, 7. А вот с остальным я не полностью согласен.
1.Я конечно ШИМ на диодах не смотрел, но частота там явно больше 50 Гц. Нет там мерцания. Да, иногда странные кратковременные потемнения на некоторых светодиодах (такое подрагивание) было, но редко. Я это списывал на срыв ШИМ при минимальном уровне яркости. Не существенно. Если в Livingstone управление "постоянным током", то надо смотреть особенности, так как если без ШИМ, то будет нагрев и потери энергии. Он греется на минимальной/максимальной яркости?2.Палитра. Хм, ок. Маркетинговый ход. А оно надо? Ну, так, побаловаться — это да. Но потом всё равно надо выбрать цвет минимально искажающий фон, чтобы днём (без подсветки) и ночью глаза не уставали.3. и 9.спящий режим = разрядка. Чехол Newton тоже с магнитиками и при закрытии гаснет экран и книга выключится через указанное в настройках время. Выключение — это единственный надёжный способ сэкономить заряд. Лучше бы сделали быстрое включение. "Время автономной работы значительно увеличилось" — а можно поточнее, особенно в сравнении с прочими "линуксовыми" ридерами?4.Ну, так-то там андроид и сортировка и фильтрация и настройки зависят от установленного приложения. Вы же не о том, что теперь стало ещё больше проблем с установкой не родного ПО?5.Wi-Fi в Newton есть! Значит Bluetooth, хм, для передачи книг, хм, ну так себе задумка. Провод — быстрее, надёжней и безопасней. Заодно и подзарядиться можно.7. и 8.Наверное это хорошо, но чем больше пикселей перерисовывать, тем больше потери заряда. Я не встречал читателей, которые устанавливали бы шрифт меньше 3 мм (не указываю в pt так как это будет связано с DPI экрана), поэтому стоит проверить, а есть ли реально выигрыш от увеличения DPI или лучше сделать рамку ещё тоньше?На моём Newton написано — 30 дней без подзарядки. Ха! Не держал и пары недель при чтении пару часов в день (ночь :) ). И это в первый год после покупки. А через 5 лет (всего!) работает только с внешним питанием. Причём тут Livingstone у него же аккумулятор в 2 раза больше? За-то и обвес стал больше — то есть избыточные mAh уйдут на что-то постороннее. Не берусь утверждать про качество самого аккумулятора, но есть сомнения.
Цена~качество, скажете. Не соглашусь, купленный ранее, чем мой Newton, примерно по той же цене и похожими характеристиками девайс другой фирмы работает до сих пор и для него 30 дней без подзарядки — это норма.