Не могли бы вы уточнить, какую конкретно задачу вы хотели ускорить с помощью 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
.Для квадратичной кривой Безье действительно можно и аналитически найти решение. Для более высоких порядков степень результанта растёт как
n
2. И если всё же заморочиться с поиском корней, то даже для кривой первого порядка аналитического решения может не быть, а пересечение с точностью до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 дней без подзарядки — это норма.