Re[17]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 23.06.13 00:51
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>>>>>А если требует то важна не сама скорость работы, а perceived performance.

EP>>>>Если вычисление идёт 30 минут, вместо возможных десяти секунд, то ты хоть как украшай progress bar рюшечками — это не поможет.
G>>>30 минут надо считать на сервере, клиент может столько и не прожить.
EP>>Что за плоское представление о мире? Кто говорил что в этом случае вообще есть сервера?
G>Здравый смысл. Десктопное приложение, считающее что-то 30 минут, без возможности остановить и продолжить "потом", в реальном мире (у не программистов) существовать не будет.

Есть десктопные приложения, которые не то что часами, а то и целыми днями, и даже неделями "что-то вычисляют". Я же говорю, какое-то плоское представление о мире.
Да и кто сказал, что нет возможности остановить и продолжить потом?

G>Ускорить его в 600 раз переписыванием даже на ассемблере в реальном мире тоже не выйдет.


Откуда 600?

G>Быстродействие с точки зрения пользователя совсем не то, о чем думают программисты C++.


Давай, расскажи нам

EP>>>>Ты вроде как толком не ответил, что не так с продолжениями в C++

G>>>то что их просто нет, а если сделать, то бестолку. Ибо комбинировать продолжения с передачей данных будет сложно, придется париться с освобождением памяти. Да и тупо может продолжение не прийти.
EP>>Почему сложно? Почему парится с освобождением памяти? Куда продолжение может не прийти?
G>Давай так: http://rsdn.ru/forum/philosophy/5208679?tree=tree
Автор: gandjustas
Дата: 23.06.13

G>тут пример кода, повтори его на C++, даже считая что есть годная библиотека для асинхронных HTTP вызовов и кто-нибудь смаршалит вызов в UI.

А я вроде как повторил, просто ты не понял

G>>>Еще раз: продолжения+детерминированная финализация. Вместе, а не по-отдельности. В общем случае нельзя придумать способ гарантированной очистки памяти. Продолжение может просто не вызваться и будет держать ссылку на замыкание.

EP>>Давай конкретный пример.
G>
G>class A
G>{
G>    int x;
G>}
G>Func<int> GetFunc()
G>{
G>    var closure = new A { x = 0 };
G>    return () => closure.x++;
G>}
G>

G>Перепиши его на C++, не изменяя семантики.
G>1) Чтобы closure не был виден вне GetFunc
G>2) Чтобы closure был освобожден когда станет недостижимым.

Слушай, ну сказал бы что совсем не знаешь C++ — мы бы тут флейм не разводили:
#include <functional>
using namespace std;

struct A
{
    int x;
};

function<int()> GetFunc()
{
    A c = {0};
    return [=]() mutable { return c.x++; };
}

int main()
{
    auto x = GetFunc();
    return x()+x()+x()-3;
}


G>>>>>Самое важное тут: как ты будешь получать этот массив и как обрабатывать. Если у тебя обработка ограниченного количества элементов за раз, то может вообще нет смысла держать в памяти все 32М, а читать с диска, на лету обрабатывать и выводить.

EP>>>>Нет, каждый элемент нужно обрабатывать много раз. Причём такие элементы будут хранится не только в массиве — это общий пример на простой абстракции в виде группировки элементов
G>>>Ниче не понял, приведи пример.
EP>>Есть группа логически связанных данных Element. Приложению нужны массивы/деки/мэпы Element'ов.
G>Пользователю не нужны они все. Что пользователю нужно?

Я правильно понимаю, что группировка данных в виде простой структуры, которая существует с незапамятных времён — это что-то за гранью понимания без полного проектного ТЗ?

G>>>>>А зачем? Цель не оптимизация сама по себе, цель — чтобы программа работала достаточно быстро.

EP>>>>А я и не говорил что оптимизация это самоцель — действительно, если тебе нужно обрабатывать 90 байтиков в секунду, то можешь хоть visual basic взять
G>>>Среднее десктопное приложение обрабатывает и того меньше.
G>>>Ты сам доказываешь что C++ не нужен и это совсем не мейнстрим.
EP>>Где я это доказывал?
G>Да почти везде

Really?

EP>>Там где нужна производительность — у C++ пока практически нет конкурентов, там где не нужна — можно использовать либо C++, либо что-то другое — зависит от конкретной задачи

G>Неуловимого джо тоже поймать никто не может, потому что нафиг никому не нужно.
G>А там где C++ сидит плотно, то скорее всего по историческим причинам.

This is so ridiculous.
Re[25]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 23.06.13 01:31
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Мода на await как раз потому что он маленький и очень мощный. Можно написать пример в 3 строки, который другие языки не осилят в 100 строк.


Ну так полезная фича для асинхронности, кто ж спорит. В Boost.Asio давно есть аналог — stackless coroutines, а Boost.Coroutine предоставляет ещё более мощное средство абстракции.
Вот только по поводу 100 vs 3 строк ты преувеличил эдак так на порядок — это маркетологи по ушам съездили? Или какие такие "другие языки" ты конкретно имеешь ввиду? А то ведь действительно, языки разные бывают.

EP>>"Чтобы ты лучше понял", C++ код приведённый выше именно это и делает, ну разве кроме EnsureSuccessStatusCode и второго await'а которых не было в исходном запросе

G>"Именно это" это что? Как он маршалит в UI?

А ты присмотрись, там есть замыкание/продолжение, которое и постится в ui'шный event-loop

G>Как он делает аснихронные вызовы?


Из GUI потока в thread pool летит замыкаие (так же как и в первоначальном запросе), когда готово — продолжение/замыкание обратно в GUI поток.

G>Ну и код background в студию. В нем скрыто самое интересное.


Конечно, там ведь драгоценный type deduction, куда уж без него:
template<typename F, typename T>
Task<result_of<F()>::type> background(F f, T t)
{
    return Task<result_of<F()>::type>(f, t);
}

Re[23]: Что посоветуете как аналог С++
От: alex_public  
Дата: 23.06.13 04:12
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Ты не рассуждай, а покажи код. Ну что за беда с сиплюсниками, чуть что, сразу в кусты. Ни кода, ни денег.


Ну вот Evgeny.Panasyuk уже опередил меня, показав самый короткий вариант (заметно удобнее чем в самом C#). Правда я предпочитаю другой вариант, т.к. этот завязан на компилятор от MS, а я стараюсь кроссплатформенные решения использовать. Но мой вариант (через Boost) на целых две строчки длиннее, так что пускай остаётся вариант через PPL. Тем более что даже забавно, решение от Microsft для C++ vs. решение от Microsoft для C#.

P.S. Кстати, после того как мы выяснили что асинхронный код не просто можно записывать на C++, но он ещё и даже короче, было бы очень интересно ещё и сравнить быстродействие...
Re[23]: Что посоветуете как аналог С++
От: alex_public  
Дата: 23.06.13 04:26
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Пример для C# неточен.


G>Вот так надо:


G>
G>private async void handler(object sender, TaskArgs args)
G>{
G>    var client = new HttpClient();
G>    var response = await client.GetAsync(args.Url, args.Cancellation);
G>    response.EnsureSuccessStatusCode();
G>    textBox.Text +=  await response.Content.ReadAsStringAsync();
G>}

G>


G>Чтобы ты лучше понимал что происходит, распишу по-русски как оно работает. Предположим что это десктопное приложение.


G>1) вызывается handler

G>2) делается запрос на сервер, метод сразу же завершается и уходит а ожидание сообщений или делает полезную работу
G>3) Когда приходит заголовок ответа вызов хендлера маршалится в UI поток через цикл обработки сообщений
G>4) Когда в UI потоке находится время обработать, он проверяет успешность вызова и запускает асинхронное чтение данных ответа и завершает вызов.
G>5) когда весь ответ прочитан вызов хендлера снова маршалится в UI поток
G>6) Кода в UI потоке находится время, он добавляет текст ответа в TextBox

Ну и зачем проверка успешности вызова делается в UI потоке? Какой смысл в этом? ) Это как раз классический пример кривой архитектуры.

G>Такая архитектура позволяет делать очень много подобной "работы", вообще без создания потоков, при этом ни на долю секунды не потеряв отзывчивость интерфейса.


Не надо иллюзий. Потоки всё равно есть, просто они в чужом коде.

G>Давай, детка, сделай это на C++.


Абсолютно без проблем этот код повторяется с помощью std::async и boost.coroutines. Будет где-то на пару строк длиннее чем C# вариант. Но лично я никогда не буду писать такой код, т.к. на мой взгляд это явно кривая архитектура. Я предпочитая использовать эрланговскую модель потоков, которая без проблем реализуется и на C++ и на c#.

G>Более того, на сервере еще интереснее ситуация. Сделав правильно обработку входящих запросов можно обработанные данные писать на диск\в базу во время того как клиент данные еще отправляет. Причем для этого не надо плодить потоки.

G>Это позволяет таких показателей латентности добиться, что ни одному серверу на C++ не снилось.

Хаха. ))) А можно поинтересоваться, какой процент от рынка например http-серверов занимают серверы написанные на c#? )
Re[24]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 23.06.13 04:50
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Ну вот Evgeny.Panasyuk уже опередил меня, показав самый короткий вариант (заметно удобнее чем в самом C#). Правда я предпочитаю другой вариант, т.к. этот завязан на компилятор от MS, а я стараюсь кроссплатформенные решения использовать. Но мой вариант (через Boost) на целых две строчки длиннее, так что пускай остаётся вариант через PPL. Тем более что даже забавно, решение от Microsft для C++ vs. решение от Microsoft для C#.


Собственно вот этот код
Автор: Evgeny.Panasyuk
Дата: 23.06.13
я специально не завязывал на PPL, так как тоже предпочитаю кроссплатформенность — например в PPL нет функции background. Главное что он реализуем.

_>P.S. Кстати, после того как мы выяснили что асинхронный код не просто можно записывать на C++, но он ещё и даже короче, было бы очень интересно ещё и сравнить быстродействие...


Я сначала влепил .then(+gui continuation context для него) вместо запятой, прям из PPL — но всё же градус и тон дискуссии требовал чего-то поострее
Re[25]: Что посоветуете как аналог С++
От: alex_public  
Дата: 23.06.13 05:14
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Я сначала влепил .then(+gui continuation context для него) вместо запятой, прям из PPL — но всё же градус и тон дискуссии требовал чего-то поострее


А у меня стоит подписка в почту на эту темку форума, так что я как раз тот вариант видел и как раз на него отвечал. ))) И кстати даже такой он выглядел короче C# варианта...
Re[18]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 23.06.13 05:22
Оценка: :))
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, gandjustas, Вы писали:


G>>>>>>А если требует то важна не сама скорость работы, а perceived performance.

EP>>>>>Если вычисление идёт 30 минут, вместо возможных десяти секунд, то ты хоть как украшай progress bar рюшечками — это не поможет.
G>>>>30 минут надо считать на сервере, клиент может столько и не прожить.
EP>>>Что за плоское представление о мире? Кто говорил что в этом случае вообще есть сервера?
G>>Здравый смысл. Десктопное приложение, считающее что-то 30 минут, без возможности остановить и продолжить "потом", в реальном мире (у не программистов) существовать не будет.

EP>Есть десктопные приложения, которые не то что часами, а то и целыми днями, и даже неделями "что-то вычисляют".

Давай, назови штук 5 таких.

EP>Да и кто сказал, что нет возможности остановить и продолжить потом?

Потому что время работы такого приложения начинает зависеть от скорости диска Это делает неверным большинство твоих рассуждений.


G>>Ускорить его в 600 раз переписыванием даже на ассемблере в реальном мире тоже не выйдет.

EP>Откуда 600?
Разница между 30 минутами и 5 секундами.

G>>Быстродействие с точки зрения пользователя совсем не то, о чем думают программисты C++.

EP>Давай, расскажи нам
Чувак, уже рассказывал, ты читал?

G>>>>Еще раз: продолжения+детерминированная финализация. Вместе, а не по-отдельности. В общем случае нельзя придумать способ гарантированной очистки памяти. Продолжение может просто не вызваться и будет держать ссылку на замыкание.

EP>>>Давай конкретный пример.
G>>
G>>class A
G>>{
G>>    int x;
G>>}
G>>Func<int> GetFunc()
G>>{
G>>    var closure = new A { x = 0 };
G>>    return () => closure.x++;
G>>}
G>>

G>>Перепиши его на C++, не изменяя семантики.
G>>1) Чтобы closure не был виден вне GetFunc
G>>2) Чтобы closure был освобожден когда станет недостижимым.

EP>Слушай, ну сказал бы что совсем не знаешь C++ — мы бы тут флейм не разводили:

EP>
EP>#include <functional>
EP>using namespace std;

EP>struct A
EP>{
EP>    int x;
EP>};

EP>function<int()> GetFunc()
EP>{
EP>    A c = {0};
EP>    return [=]() mutable { return c.x++; };
EP>}

EP>int main()
EP>{
EP>    auto x = GetFunc();
EP>    return x()+x()+x()-3;
EP>}
EP>

Семантика не сохранена, A не в куче.
Я думал ты хоть до этого сам догадаешься.

G>>>>>>Самое важное тут: как ты будешь получать этот массив и как обрабатывать. Если у тебя обработка ограниченного количества элементов за раз, то может вообще нет смысла держать в памяти все 32М, а читать с диска, на лету обрабатывать и выводить.

EP>>>>>Нет, каждый элемент нужно обрабатывать много раз. Причём такие элементы будут хранится не только в массиве — это общий пример на простой абстракции в виде группировки элементов
G>>>>Ниче не понял, приведи пример.
EP>>>Есть группа логически связанных данных Element. Приложению нужны массивы/деки/мэпы Element'ов.
G>>Пользователю не нужны они все. Что пользователю нужно?

EP>Я правильно понимаю, что группировка данных в виде простой структуры, которая существует с незапамятных времён — это что-то за гранью понимания без полного проектного ТЗ?

В ТЗ такого не бывает, в принципе. Расскажи что на выходе получить надо.



EP>>>Там где нужна производительность — у C++ пока практически нет конкурентов, там где не нужна — можно использовать либо C++, либо что-то другое — зависит от конкретной задачи

G>>Неуловимого джо тоже поймать никто не может, потому что нафиг никому не нужно.
G>>А там где C++ сидит плотно, то скорее всего по историческим причинам.
EP>This is so ridiculous.
Ты случайно выделил два фрагмента и стала мыль правильнее? Сейчас есть тонны кода на C++, которые никто и никогда на другие языки не перепишет. Как на коболе в свое время.
Более того, говорят и сейчас на коболе работает больше всего кода.
Re[26]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 23.06.13 05:27
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, gandjustas, Вы писали:


G>>Мода на await как раз потому что он маленький и очень мощный. Можно написать пример в 3 строки, который другие языки не осилят в 100 строк.


EP>Ну так полезная фича для асинхронности, кто ж спорит. В Boost.Asio давно есть аналог — stackless coroutines, а Boost.Coroutine предоставляет ещё более мощное средство абстракции.

EP>Вот только по поводу 100 vs 3 строк ты преувеличил эдак так на порядок — это маркетологи по ушам съездили? Или какие такие "другие языки" ты конкретно имеешь ввиду? А то ведь действительно, языки разные бывают.

Я пока не увидел аналога await

EP>>>"Чтобы ты лучше понял", C++ код приведённый выше именно это и делает, ну разве кроме EnsureSuccessStatusCode и второго await'а которых не было в исходном запросе

G>>"Именно это" это что? Как он маршалит в UI?

EP>А ты присмотрись, там есть замыкание/продолжение, которое и постится в ui'шный event-loop

Без внутренностей background\Task этого не видно.

G>>Как он делает аснихронные вызовы?

EP>Из GUI потока в thread pool летит замыкаие (так же как и в первоначальном запросе), когда готово — продолжение/замыкание обратно в GUI поток.
Код покажи

G>>Ну и код background в студию. В нем скрыто самое интересное.


EP>Конечно, там ведь драгоценный type deduction, куда уж без него:

EP>
EP>template<typename F, typename T>
EP>Task<result_of<F()>::type> background(F f, T t)
EP>{
EP>    return Task<result_of<F()>::type>(f, t);
EP>}
EP>

EP>
We need to go deeper.
Покажи что делает task.
Re[24]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 23.06.13 05:44
Оценка: -1
Здравствуйте, alex_public, Вы писали:

_>Здравствуйте, gandjustas, Вы писали:


G>>Чтобы ты лучше понимал что происходит, распишу по-русски как оно работает. Предположим что это десктопное приложение.


G>>1) вызывается handler

G>>2) делается запрос на сервер, метод сразу же завершается и уходит а ожидание сообщений или делает полезную работу
G>>3) Когда приходит заголовок ответа вызов хендлера маршалится в UI поток через цикл обработки сообщений
G>>4) Когда в UI потоке находится время обработать, он проверяет успешность вызова и запускает асинхронное чтение данных ответа и завершает вызов.
G>>5) когда весь ответ прочитан вызов хендлера снова маршалится в UI поток
G>>6) Кода в UI потоке находится время, он добавляет текст ответа в TextBox

_>Ну и зачем проверка успешности вызова делается в UI потоке? Какой смысл в этом? ) Это как раз классический пример кривой архитектуры.

А в случае ошибки выкинуть messagebox? Думаешь из non-ui thread это хорошая идея?
Да и откуда известно что ты там делать будешь? Просто status code сравнить или что-то сложное.

Как раз по умолчанию все маршалить UI поток для обработки — хорошая идея. Отключается одной функцией если ты пишешь либу.

G>>Такая архитектура позволяет делать очень много подобной "работы", вообще без создания потоков, при этом ни на долю секунды не потеряв отзывчивость интерфейса.

_>Не надо иллюзий. Потоки всё равно есть, просто они в чужом коде.
Там пул потоков, обрабатывающих IOcompletion. Но это детали реализации. В WinRT может что-то другое работает.

G>>Давай, детка, сделай это на C++.


_>Абсолютно без проблем этот код повторяется с помощью std::async и boost.coroutines. Будет где-то на пару строк длиннее чем C# вариант. Но лично я никогда не буду писать такой код, т.к. на мой взгляд это явно кривая архитектура. Я предпочитая использовать эрланговскую модель потоков, которая без проблем реализуется и на C++ и на c#.

Если без проблем повторяется, то повтори. Только не скрывай важные детали.
Интереснее всего увидеть как осуществляется прерывание метода и передача данных. и как это все работает в реальном окружении (обработка нажатий конопок в интерфейсе).
Ибо твои boost.coroutines скорее всего ни один UI-Фреймворк не поддерживает.

G>>Более того, на сервере еще интереснее ситуация. Сделав правильно обработку входящих запросов можно обработанные данные писать на диск\в базу во время того как клиент данные еще отправляет. Причем для этого не надо плодить потоки.

G>>Это позволяет таких показателей латентности добиться, что ни одному серверу на C++ не снилось.

_>Хаха. ))) А можно поинтересоваться, какой процент от рынка например http-серверов занимают серверы написанные на c#? )

Что ты имеешь ввиду под http-сервером? Штуку которая принимает http запрос и отдает ответ или штуку которая принимает http запрос и передает управление другому модулю?
Если второе, то таких нет по историческим причинам. Все промышленные серверы написаны давно, причем IIS например имеет часть в ядре, так что C# туда не пролезет.
Другое дело что это довольно малая часть всего конвеера обработки запросов, гораздо большая часть в том же IIS — asp.net, который 100% на .NET

Хотя вот в Singularity сделали веб-сервер на .NET, и, по тестам, он неплохо себя показал.
Re[19]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 23.06.13 06:58
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>>>Здравый смысл. Десктопное приложение, считающее что-то 30 минут, без возможности остановить и продолжить "потом", в реальном мире (у не программистов) существовать не будет.

EP>>Есть десктопные приложения, которые не то что часами, а то и целыми днями, и даже неделями "что-то вычисляют".
G>Давай, назови штук 5 таких.

ANSYS, Abaqus, LS-DYNA, и даже отечественные: MicroFe, Лира, SCAD. И это всё по одной теме, а есть ещё и другие.

EP>>Да и кто сказал, что нет возможности остановить и продолжить потом?

G>Потому что время работы такого приложения начинает зависеть от скорости диска Это делает неверным большинство твоих рассуждений.

Простейший пример: умножение плотных матриц достаточно ресурсоёмкая операция, но при этом загруженное однажды значение можно использовать N раз, если дело даже дойдёт до диска, то при современных объёмах ОЗУ N будет > 30000.
Если ты не отходил далее чем на 10км от дома — это не значит что мир плоский как диск.

G>>>Ускорить его в 600 раз переписыванием даже на ассемблере в реальном мире тоже не выйдет.

EP>>Откуда 600?
G>Разница между 30 минутами и 5 секундами.

Так, теперь откуда взялось 5 секунд, и как у тебя разница между 30мин и 5с получилась 600?

G>>>Перепиши его на C++, не изменяя семантики.

G>>>1) Чтобы closure не был виден вне GetFunc
G>>>2) Чтобы closure был освобожден когда станет недостижимым.
[...]
G>Семантика не сохранена, A не в куче.
G>Я думал ты хоть до этого сам догадаешься.

Пункты выше выполнил, но шапку для телепатии не надел, ага — запихивать int в кучу у меня рука не поднялась. Попробую с шапкой:
function<int()> GetFunc()
{
    auto c = make_shared<A>(A{0});
    return [=]{ return c->x++; };
}

Вернёмся к вопросу об "кастрированости" лямбд/замыканий, времени жизни, мусоре и т.п.
В некоторой функции foo, открывается некоторый ресурс bar (память/соединение/etc) — этот ресурс захватывается лямбдой. Лямбда принимает некий параметр, передаёт в ресурс (например записывает строчку в файл) и возвращает результат операции. Лямбда прокидывается на пару уровней наверх по call stack'у, причём по пути её могут использовать.
Задача: как только (это значит сразу, а не когда мир остановится ибо ресурс ценный) лямбда становится не достижима, ресурс должен быть освобождён, ибо на него очередь, причём он не должен быть потерян в мусорник при вылетевшем исключении.
Покажи код на C#.

EP>>>>Там где нужна производительность — у C++ пока практически нет конкурентов, там где не нужна — можно использовать либо C++, либо что-то другое — зависит от конкретной задачи

G>>>Неуловимого джо тоже поймать никто не может, потому что нафиг никому не нужно.
G>>>А там где C++ сидит плотно, то скорее всего по историческим причинам.
EP>>This is so ridiculous.
G>Ты случайно выделил два фрагмента и стала мыль правильнее? Сейчас есть тонны кода на C++, которые никто и никогда на другие языки не перепишет. Как на коболе в свое время.
G>Более того, говорят и сейчас на коболе работает больше всего кода.

Допустим есть C++ legacy код, который если бы разрабатывался сейчас — то было бы выбрано что-нибудь другое, ок — не спорю.
Как это относится к подчёркнутому выше, и согласен ли ты с этим?
Re[27]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 23.06.13 08:37
Оценка:
Здравствуйте, gandjustas, Вы писали:

EP>>Ну так полезная фича для асинхронности, кто ж спорит. В Boost.Asio давно есть аналог — stackless coroutines, а Boost.Coroutine предоставляет ещё более мощное средство абстракции.

EP>>Вот только по поводу 100 vs 3 строк ты преувеличил эдак так на порядок — это маркетологи по ушам съездили? Или какие такие "другие языки" ты конкретно имеешь ввиду? А то ведь действительно, языки разные бывают.
G>Я пока не увидел аналога await

Stackless coroutine аналог await это:
void test1(async)
{ 
    state_machine(test1)
    {
         cout << 1 << endl;
         await do_async( print("a1") );
         cout << 2 << endl;
         await do_async( print("a2") );
         cout << 3 << endl;
    }
}
 
void test2(async)
{ 
    state_machine(test2)
    {
         cout << "x" << endl;
         await do_async( print("b1") );
         cout << "y" << endl;
         await do_async( print("b2") );
         cout << "z" << endl;
    }
}
 
int main()
{
    test1();
    test2();
    while(!async_q.empty())
    {
        cout << "async loop" << endl;
        async_q.front()();
        async_q.pop();
    }
}

Вывод:
1
x
async loop
a1
async loop
2
async loop
b1
async loop
y
async loop
a2
async loop
3
async loop
b2
async loop
z


G>>>Как он делает аснихронные вызовы?

EP>>Из GUI потока в thread pool летит замыкаие (так же как и в первоначальном запросе), когда готово — продолжение/замыкание обратно в GUI поток.
G>Код покажи

Вот такой псевдокод понятней?
void handler(Object sender, TaskArgs args)
{
    StartNew( () => download(args.url), args.cancellation, on_workpool).then
    (
        result => textBox.Text += result,
        on_gui_thread
    );
}
Re[24]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 23.06.13 09:50
Оценка: -1 :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Это задача — извне приходит массив элементов и индексы. Если бы извне приходили уже готовые координаты векторов, без индексов, то это была бы другая задача.

EP>Точно также как если бы для FFT входная функция задавалась таблично, либо как callback — код не был бы идентичным.
EP>Хватит разводить демагогию — talk is cheap show me the code.

Ля-ля-ля. Сначала выдай задачу так как это сделал я. Массивы, индексы, элементы- это ты решение конкретное предлагаешь. Не можешь — ничего не пиши в ответ.

EP>ага, как попало:

EP>
EP>

EP>А что это такое белое и пушистое прилетело в виде System.ObjectDisposedException?

Ты не видишь разницы между замыканием и внешним ресурсом ?

EP>И как то что где-то когда-то использовалось C, подтверждает твой тезис "быстрый код на С++ это точно так же работа против языка"?


Да все очевидно — хочешь быстродействия, надо реализовывать приседания с со стеком, вызывать низкоуровневые функции, писаные на ассемблере, и вообще писать код который не использует вообще ничего из С++.
Ты в курсе, что С это не С++ ?

EP>Есть аутсорсная контора, в ней два независимых проекта один на foo другой на bar — какой код считать типичным? foobar? Нет, так ведь foo в 2 раза больше — значит foofoobar?


Я уже и ответ сам сказал, а до тебя не доходит и ты просишь что бы я еще раз подсказал тебе Еще раз и внятно — типичный == мода(статистика, а не одежда). Где работает бОльше людей — это и есть типичный код.
Если ты 16 часов работаешь, а 8 часов спишь, то типичное времяпровождение это работа. А если наоборот — то сон. Все предельно понятно.
Потому не надо удивляться, что большинство работает с некачественным кодом. Это вообще везде так. Только в С++ разница гораздо больше чем в других языках.
Re[22]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 23.06.13 09:53
Оценка: -1 :))
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>C++1998:

EP>
EP>void handler(Object &sender, TaskArgs &args)
EP>{
EP>    background(bind(download, args.url), args.cancellation),
EP>    textBox.Text += _1;
EP>}
EP>

EP>

И где здесь высокоуровневый подход ? Ручное связывание через bind или _1 — это оно что ли ? Я надеюсь, это не глобальная переменная ?
А как быть в случае, если в коде несколько await ? Я ведь и такой пример приводил.
Re[24]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 23.06.13 10:06
Оценка: :)
Здравствуйте, alex_public, Вы писали:

_>P.S. Кстати, после того как мы выяснили что асинхронный код не просто можно записывать на C++, но он ещё и даже короче, было бы очень интересно ещё и сравнить быстродействие...


Похоже сиплюсплюс это уже признак деградации

Скажу страшное устройство, файловая система, база данных не умеют делать процессинг быстрее для какого то реквеста, сделаного на особенном языке программирования.
То есть, в коде прошивки HDD нет таких строчек
if(code_of_user_progra_that_made_request == C_PLUS_PLUS)
   FastestProcessing();
else
   SlowProcessing();


Вот когда такой код появится в прошивке, драйвере файловой системы или движде базы данных или веб сервере, вот тогда и можно будет производительность сравнивать.
Re[25]: Что посоветуете как аналог С++
От: Cyberax Марс  
Дата: 23.06.13 10:10
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Вот когда такой код появится в прошивке, драйвере файловой системы или движде базы данных или веб сервере, вот тогда и можно будет производительность сравнивать.

А он там есть. Большое managed-приложение съест кучу памяти, оставив меньше места под кэш.

Вот и получается:
if (connection->client_is_managed())
   connection->set_slow_mode();
Sapienti sat!
Re[24]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 23.06.13 10:12
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Ну и зачем проверка успешности вызова делается в UI потоке? Какой смысл в этом? ) Это как раз классический пример кривой архитектуры.


Проверка успешности вызова делается там, где нужно. Часто именно вызывающий код имеет все необходимое для такой обработки. Если делать как ты предложил, придется маршалить весь контекст, который очень часто привязан к потоку. Это необязательно UI, это может быть просто любой объект, который привязан к потоку. Почему именно так — да хрен его знает, спрашивай тех ребят, который писали многопоточность на православном С++ под вындоус тот же


G>>Это позволяет таких показателей латентности добиться, что ни одному серверу на C++ не снилось.


_>Хаха. ))) А можно поинтересоваться, какой процент от рынка например http-серверов занимают серверы написанные на c#? )


ASP.NET в IIS на С#, аналогичные вещи есть и в джаве и тд и тд и тд. Весь сервер никогда не пишется полностью на менеджед, в основном потому что обчно это завязано на ядро, то есть, нет внятного интерфейса для менеджед кода.
Re[25]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 23.06.13 10:40
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Ля-ля-ля. Сначала выдай задачу так как это сделал я. Массивы, индексы, элементы- это ты решение конкретное предлагаешь. Не можешь — ничего не пиши в ответ.


Сумма векторов такая же задача как и FFT
Сферического "интенсивного заиспользования" java'ы за десяток сообщений ты так не показал — всё, уже не интересно.

EP>>ага, как попало:

EP>>
EP>>

EP>>А что это такое белое и пушистое прилетело в виде System.ObjectDisposedException?
I>Ты не видишь разницы между замыканием и внешним ресурсом ?

I>>>Отсюда ясно, что __обязательность__ какого то выбора это совсем не то же самое, что и свобода выбора. Вот если бы можно было передавать лямбды как попало, а вот тюнить надо было только для перформанса-расхода памяти, тогда другое дело.



EP>>И как то что где-то когда-то использовалось C, подтверждает твой тезис "быстрый код на С++ это точно так же работа против языка"?


I>Да все очевидно — хочешь быстродействия, надо реализовывать приседания с со стеком, вызывать низкоуровневые функции, писаные на ассемблере,


Как раз таки C++ позволяет сделать легковесные и удобные абстракции над машиной, даже на самых низких уровнях, поднимаясь потом всё выше и выше, например над интринсинками и это замечательно

I>и вообще писать код который не использует вообще ничего из С++.

I>Ты в курсе, что С это не С++ ?

"Остапа несло"

I>Потому не надо удивляться, что большинство работает с некачественным кодом.


А где я этому удивлялся? Твоя позиция какая:
1. На C++ можно писать очень быстрый код, используя богатые возможности языка. Но при этом язык нужно знать хорошо.
или
2. На C++ писать быстрый код нельзя вообще, нужно отказываться от всех возможностей и оставлять C.
Re[23]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 23.06.13 10:57
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>C++1998:

EP>>
EP>>void handler(Object &sender, TaskArgs &args)
EP>>{
EP>>    background(bind(download, args.url), args.cancellation),
EP>>    textBox.Text += _1;
EP>>}
EP>>

EP>>

I>И где здесь высокоуровневый подход?


define высокоуровневый. только тот что вшит в язык?

I>Ручное связывание через bind


Это вообще-то первый стандарт языка. Такой код можно писать очень давно, а не только с прошлого года.
Если не нравится bind (который уже стандарт), можно взять лямбду из нового стандарта:
background([=]{ return download(args.url); }, args.cancellation)



I>или _1 — это оно что ли ? Я надеюсь, это не глобальная переменная ?


Это placeholder для полиморфной лямбды — значения непосредственно через него не передаются, и да это глобальная константа

I>А как быть в случае, если в коде несколько await ? Я ведь и такой пример приводил.


Я не знаю где там этот пример — я отвечал на конкретное сообщение. Видимо у тебя там что-то типа:
    background(bind(download, args.url), args.cancellation),
    textBox.Text += _1,
    await([=]{ return download(args.url + "foo"); }),
    textBoxBar.Text += _1;

Re[26]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 23.06.13 14:22
Оценка: :))
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Сумма векторов такая же задача как и FFT


FFT вполне конкретная. А свои массивы ты просто подогнал под желаемый результат.

EP>Сферического "интенсивного заиспользования" java'ы за десяток сообщений ты так не показал — всё, уже не интересно.


Джавый я как то не мог обещать показать, ибо на ней сроду не писал.

I>>Ты не видишь разницы между замыканием и внешним ресурсом ?


EP>

I>>>>Отсюда ясно, что __обязательность__ какого то выбора это совсем не то же самое, что и свобода выбора. Вот если бы можно было передавать лямбды как попало, а вот тюнить надо было только для перформанса-расхода памяти, тогда другое дело.

EP>

Представь себе, лямбда и файловый ресурс это не одно и то же. Если ты файловый ресурс поместил в лямбду, он не станет от этого лямбдой. Вроде очевидно, но не для сиплюсника


I>>Да все очевидно — хочешь быстродействия, надо реализовывать приседания с со стеком, вызывать низкоуровневые функции, писаные на ассемблере,


EP>Как раз таки C++ позволяет сделать легковесные и удобные абстракции над машиной, даже на самых низких уровнях, поднимаясь потом всё выше и выше, например


Я уже понял, что по твоему удобство — всё контролировать руками.


EP>А где я этому удивлялся? Твоя позиция какая:


EP>2. На C++ писать быстрый код нельзя вообще, нужно отказываться от всех возможностей и оставлять C.


Не хочется учить тебя читать, но моя позиция такая — на С++ типичный случй быстрого кода это сишный стиль или "кодирование против языка". За примерами в Сфинкс и короутины буста.
Re[26]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 23.06.13 14:27
Оценка: :))) :)
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, Ikemefula, Вы писали:


I>>Вот когда такой код появится в прошивке, драйвере файловой системы или движде базы данных или веб сервере, вот тогда и можно будет производительность сравнивать.

C>А он там есть. Большое managed-приложение съест кучу памяти, оставив меньше места под кэш.

Гипотетический случай. Утечки и ошибки с указателями в С++ дают куда больше реальных проблем.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.