Здравствуйте, MTD, Вы писали:
MTD>Здравствуйте, gandjustas, Вы писали:
G>>Отлично G>>1) Если пользователь часто нажимает, то время ожидания растет.
MTD>Как повезет. Чисто физически у тебя кабель один, так что если пакеты данных большие, а кликают часто, то как ни крутись, а очередь возникнет.
Но у тебя следующий пакет обработается когда полный цикл отправить-получить-сохранить-отправить.
А кабель не при чем, больше всего времени уходит в ожидание ответа сервера.
G>>2) race condition в очереди.
MTD>Откуда?
А Queue у тебя thread-safe?
G>>3) запись в базу и в сеть идет последовательно, а не параллельно. MTD>С чего вдруг? Очередь может иметь пул и по ним раскидывать данные.
Код в студию.
Вот уже сложность растет.
G>>4) нету кода, который вызывает ProcessTask, он у тебя довольно нетривальный будет.
MTD>Он будет тривиальный — wait/notify, просто писать лень.
Угу.
Вот самое интересное ты и пропустил — как собственно скомбинировать асинхронные операции, а написал банальный линейный код, который должен внутри как-то эффективно работать.
Ты пот покажи как сделать эту самую эффективную работу, чтобы не ожидать завершения IO в потоке и параллелить операции.
G>Пока ты не начинаешь комбинировать асинхронные вызовы это еще нормально смотрится, а попробуй сделать так чтобы при запершении одной асинхронной операции вызывалась другая, а за ней третья и так далее.
G>Сразу код станет нечитаем совершенно.
Не спорю будет гораздо корявее чем в C#, но вполне читабельно.
Если уж смотреть где красиво это в F# с его async.
G>А без этого никак. Никто тебе в UI потоке не позволит ожидание завершения IO делать.
Да ладно как будто до асинхронной моды UI приложения не писали.
Тык сахар рулит.
В F# еще лучше.
G>Я об этом и говорю, вся стройность RAII рассыпается из-за продолжений.
Тут скорее согласен, нужны некоторые дополнения в язык чтобы было не так коряво.
Лучше всего взять пример с F# и сразу ввести Computation Expressions (монады)
Здравствуйте, gandjustas, Вы писали:
G>Корутины и продолжения не одно и тоже, но стоит глянуть как оно реализовано. G>Я об этом и говорю, вся стройность RAII рассыпается из-за продолжений.
Здравствуйте, gandjustas, Вы писали:
G>Но у тебя следующий пакет обработается когда полный цикл отправить-получить-сохранить-отправить.
Это не так. Из кода очевидно, что в очередь добавляется задача выполняющаяся асинхронно и без всяких задержек начинается новая итерация.
G>>>2) race condition в очереди.
MTD>>Откуда?
G>А Queue у тебя thread-safe?
Она такая какая надо.
G>>>3) запись в базу и в сеть идет последовательно, а не параллельно. MTD>>С чего вдруг? Очередь может иметь пул и по ним раскидывать данные. G>Код в студию. G>Вот уже сложность растет.
Код приведен.
G>>>4) нету кода, который вызывает ProcessTask, он у тебя довольно нетривальный будет.
MTD>>Он будет тривиальный — wait/notify, просто писать лень. G>Угу.
G>Вот самое интересное ты и пропустил — как собственно скомбинировать асинхронные операции, а написал банальный линейный код, который должен внутри как-то эффективно работать. G>Ты пот покажи как сделать эту самую эффективную работу, чтобы не ожидать завершения IO в потоке и параллелить операции.
Мне банально лень, нужен стимул. В самом коде ничего сложного нет.
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, gandjustas, Вы писали:
G>>Корутины и продолжения не одно и тоже, но стоит глянуть как оно реализовано. G>>Я об этом и говорю, вся стройность RAII рассыпается из-за продолжений.
J>Чем тебя не устроил мой пример с продолжениями?
Так он не асинхронный, в чем смысл тогда? Основная суть продолжений что они позволяют не ожидать завершения IO в потоке. Или, напрмиер, ожидать действий пользователя. И очень важно уметь комбинировать продолжения, в том числе асинхронные, с передачей данных между ними.
А что ты показал? Передача указателя на функцию? Даже без замыканий.
Здравствуйте, MTD, Вы писали:
DM>>Кстати, да, сколько? Сколько новых популярных десктопных приложений появилось на плюсах за последние годы?
MTD>Много. Только из того, что у меня сейчас открыто: Google Chrome, Skype, Virtual Box, Qt Creator.
Google Chrome — обертка над WebKit, который тянется с прошлого века (Initial release November 4, 1998).
Skype вообще на Delphi написан.
Остальные два ок. Но на каждый Qt Creator найдется свой Eclipse (Java) и MonoDevelop (C#).
Не только в сахаре дело, если ты попробуешь написать код на C++ как в F#, то он не только гораздо многословнее будет, но и возникнут сложности с передачей данных между продолжениями.
Здравствуйте, gandjustas, Вы писали:
J>>Чем тебя не устроил мой пример с продолжениями?
G>Так он не асинхронный, в чем смысл тогда? Основная суть продолжений что они позволяют не ожидать завершения IO в потоке. Или, напрмиер, ожидать действий пользователя. И очень важно уметь комбинировать продолжения, в том числе асинхронные, с передачей данных между ними.
G>А что ты показал? Передача указателя на функцию?
Да, это и есть продолжение, вообще-то. Его можно использовать в том числе и для IO, но оно этим не ограничивается, естественно.
Но если тебе нужно именно IO:
cont асинхронно позовется, когда асинхронно же считается все, что нужно.
Это заодно и ответ для Ikemefula про его качалку файлов.
G>Даже без замыканий.
Детский сад. Замыкания — это либо Boost.Bind для C++03, либо встроенные лямбды для C++11. Так что, я надеюсь, ты больше замыкания не будешь упоминать в приличном обществе.
Здравствуйте, MTD, Вы писали:
DM>>Google Chrome — обертка над WebKit, который тянется с прошлого века (Initial release November 4, 1998). MTD>Отчего его в .Net не обернули?
Не было смысла, полагаю.
DM>>Skype вообще на Delphi написан. MTD>Что? Разве что самая первая версия.
Да нет, виндовая версия 4.2 (спустя 7 лет после первой) все еще на Дельфи. Надо будет на более свежие взглянуть.
MTD>Ну да, на Java есть ровно три десктопных приложений — NetBeans, Eclipse, Idea
Вроде того.
Если смотреть у кого что установлено, то у меня еще:
vReveal — обработка видео, гуй на дотнете, алгоритмы на CUDA и чем-то нативном.
SourceTree — git клиент, .NET + WPF. Супер аппаратно ускоренный, запускается полчаса.
Mercurial — и вовсе на питоне.
компиляторы всякие (Haxe, GHC, Idris) — на окамле и хаскеле.
Здравствуйте, FR, Вы писали:
I>>По моему это есть всяких сортов пляски. Хотя я не уверен, давно пора пляски с памятью и стеком сделать частью языка С++, как это было сделано со смартпоинтерами. Тогда уж точно нельзя будет придраться
FR>Как будто код с async который ты чуть выше привел не занимается за кулисами тем же самым.
Здравствуйте, MTD, Вы писали:
DM>>Кстати, да, сколько? Сколько новых популярных десктопных приложений появилось на плюсах за последние годы?
MTD>Много. Только из того, что у меня сейчас открыто: Google Chrome, Skype, Virtual Box, Qt Creator.
Здесь один только хром можно рассматривать и это именно та область, где менеджед особо некуда всунуть. Притом сам WebKit это древняя вещь — 1998.
Skype — 2003,
Virtual Box и Qt Creator сложно назвать популярным, эдак в качестве популярных сгодится SharpDevelop, ExpressionBlend и подобные вещи.
Можно зайти с другой стороны — какие известные бизнес приложения были написаны на С++ ? Ну скажем для бухгалтерии, инвентаризации, страхования, учет и тд и тд ?
Какие известные веб-приложения были написаны на С++ ?
Здравствуйте, MTD, Вы писали:
DM>>Google Chrome — обертка над WebKit, который тянется с прошлого века (Initial release November 4, 1998). MTD>Отчего его в .Net не обернули?
А зачем ?
DM>>Skype вообще на Delphi написан.
MTD>Что? Разве что самая первая версия.
2003й год все таки, а мы смотрим после 2005го.
DM>>Остальные два ок. Но на каждый Qt Creator найдется свой Eclipse (Java) и MonoDevelop (C#).
MTD>Ну да, на Java есть ровно три десктопных приложений — NetBeans, Eclipse, Idea
На джаве полно софта для проектирования, CAD/CAM и тд.
Здравствуйте, Ikemefula, Вы писали:
EP>>>>В большинстве же приложений — это то, во что упирается производительность. А это не только скорость, но и энергоэффективность, и цена железа. I>>>Большинство оно сильно разное. И если уж совсем про большинство говорить, то проблемы точно не с производительность. EP>>А я не спорю что высокая производительность не везде нужна. I>Ну вот видишь.
Ты не поверишь, для некоторых задач я советую людям изучить/использовать C#, а сам частенько использую Python.
[sarcasm mode]только не рассказывай ребятам с форума C++, а то они меня побьют и заберут партбилет[/sarcasm mode]
EP>>>>Как пример — эти аллокации вылезают по всему коду, при простейших абстракциях — просадка 16x на ровном месте. I>>>Такой код в своём уме никто не пишет, кроме вчерашних плюсовиков, которые не знают как устроена память. EP>>Talk is cheap, show me the code. I>А задача какая, выделить массив в сто тыщ мульёнов и пройтись по ём в цикле ?
Задача сделать простейшею абстракцию, которая существует с незапамятных времён и используется повсеместно, в виде группировки разнотипных данных(хотя бы однотипных) в одну сущность(структуру/запись/класс), так чтобы её можно было использовать с разными типами контейнеров, в том числе массивов, без просадки скорости на порядок.
I>>>Это ни о чем. EP>>Это мнение человека который разрабатывал алгоритмические библиотеки для Scheme, Ada, Java, C++ I>Это уже устаревший подход.
Допустим эффективные алгоритмы и структуры данных это устаревший подход, тогда какой современный? "Петрович, подвози исчё кластера"
I>>>А если скажем сюда внести работу с диском, базой или сетью, все поворачивается ровно наоборот — С++ не в состоянии обеспечить перформанс, например потому что тяжело контролировать асинхронные операции. Всё, до свидания. EP>>stackless coroutines, stackfull coroutines, state machine, лямбды в конце концов I>И ничего из этого в сиплюсплюсе нет
stackful coroutines — реализованы с использованием system-specific вызовов
stackless coroutines — реализованы на чистом ISO C++, меньше чем 100 строками кода
state machine — бери хоть банальный switch, хоть готовые библиотеки
I>а лямбды сильно кастрированые что бы их называть таким словом.
То что где-то используют C или "C-подобный подход" отнюдь не означает что по другому нельзя. А вот наличие библиотеки с другим подходом которая быстра и резва, как раз и является примером тому что таки можно.
Здравствуйте, jazzer, Вы писали:
J>cont асинхронно позовется, когда асинхронно же считается все, что нужно. J>Это заодно и ответ для Ikemefula про его качалку файлов.
Если это твой ответ, то ты слился, кода нет, только сигнатуры Собственно для сиплюсника это стандартный ответ — показать сигнатуры и рассказать что всё классно.
Мне скажем дописать пару строк и будет совершенно другая вещь, комбинация синхронного и асинхронного. А у тебя что получится ?
private async void handler(object sender, TaskArgs args)
{
string result = await new Task(() => Download(args.Url, args.Cancellation));
if(SomeCondition(rawResult))
{
result = await new Task(() => Preproces(result, args.Cancellation));
}
textBox.Text += result;
}
Здравствуйте, Ikemefula, Вы писали:
I>Можно зайти с другой стороны — какие известные бизнес приложения были написаны на С++ ? Ну скажем для бухгалтерии, инвентаризации, страхования, учет и тд и тд ?
Здравствуйте, Ikemefula, Вы писали:
I>Здравствуйте, jazzer, Вы писали:
J>>cont асинхронно позовется, когда асинхронно же считается все, что нужно. J>>Это заодно и ответ для Ikemefula про его качалку файлов.
I>Если это твой ответ, то ты слился, кода нет, только сигнатуры Собственно для сиплюсника это стандартный ответ — показать сигнатуры и рассказать что всё классно.
А какой тебе код нужен? Код cont? Так он вот таким будет: "textBox.Text += result"
I>Мне скажем дописать пару строк и будет совершенно другая вещь, комбинация синхронного и асинхронного. А у тебя что получится ?
I>
I>private async void handler(object sender, TaskArgs args)
I>{
I> string result = await new Task(() => Download(args.Url, args.Cancellation));
I> if(SomeCondition(rawResult))
I> {
I> result = await new Task(() => Preproces(result, args.Cancellation));
I> }
I> textBox.Text += result;
I>}
I>
И где тут "совершенно другая вещь"?
Всё то же самое.
I>Вобщем отдыхай.
В общем, не хами.