|
Как проверять ускорение от многопоточности ?
|
|||
---|---|---|---|
#18+
Привет. Интересует такой вопрос - как убедится, что алгоритм, написанный с async/await и Таск'ами действительно быстрее, чем синхронный. Есть ли какой-то обучающий материал по инструментарию, который позволит увидеть в графиках и прочем, как ведет себя алгоритм и т.д. Крайней желательно, чтобы инструментарий был бесплатным. Я знаю, что в студии есть, вроде бы, графики перфоманса, но нужно разобраться как их понимать, в применении к многопоточности. Знаете ли какой-то обучающий материал по этой теме ? Статьи может быть ? Хочу по чаще применять async-awayt. Но, без графиков и конеректных цифр может выйти так, что программа стала даже медленней ! Нужно видеть результать и уметь его анализировать. Подскажите плиз. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2014, 01:00 |
|
Как проверять ускорение от многопоточности ?
|
|||
---|---|---|---|
#18+
Единственная причина по которой асинхронные задачи могут быть быстрее синхронных - лучшая загрузка процессора. Поэтому в вашем случае проверить очень просто: 1) Написали синхронный алгоритм, посмотрели в Диспетчере задач загрузку CPU. 2) Написали асинхронный алгоритм, еще раз посмотрели. Более того, вы должны понимать, что async/await - это просто синтаксический сахар, который не дает никакой асинхронности из коробки. async/await действительно становится асинхронным только в том случае, если последний вызов в цепочке является истинной асинхронной операцией (например, вызов операции на асинхронном сокете, отправка какой-то задачи в тред пул, и т.д.). ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2014, 08:51 |
|
Как проверять ускорение от многопоточности ?
|
|||
---|---|---|---|
#18+
cdtyjvЕдинственная причина по которой асинхронные задачи могут быть быстрее синхронных - лучшая загрузка процессора. Поэтому в вашем случае проверить очень просто: 1) Написали синхронный алгоритм, посмотрели в Диспетчере задач загрузку CPU. 2) Написали асинхронный алгоритм, еще раз посмотрели. Да уж, мастер-класс бенчмаркинга :) Мера скорости решения задачи - тоже по загрузке проца? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2014, 12:40 |
|
Как проверять ускорение от многопоточности ?
|
|||
---|---|---|---|
#18+
Я бы измерил время выполнения синхронной операции и в Task.ContinueWIth - асинхронной, и сделал выводы. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2014, 12:42 |
|
Как проверять ускорение от многопоточности ?
|
|||
---|---|---|---|
#18+
PallarisДа уж, мастер-класс бенчмаркинга :) Мера скорости решения задачи - тоже по загрузке проца?То есть вы, господин трепло, во-первых, не понимаете чем вызвано ускорение при асинхронных операциях, а во-вторых не отличаете микробенчмарки от макробенчмарков. А зачем тогда пишете здесь и советы даете? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2014, 13:21 |
|
Как проверять ускорение от многопоточности ?
|
|||
---|---|---|---|
#18+
cdtyjvТо есть вы, господин трепло Что там с кодом-то, кстати? Покажешь? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2014, 13:48 |
|
Как проверять ускорение от многопоточности ?
|
|||
---|---|---|---|
#18+
cdtyjvЕдинственная причина по которой асинхронные задачи могут быть быстрее синхронных - лучшая загрузка процессора. нет это в корне не так, это не единственная и даже не основная ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2014, 14:08 |
|
Как проверять ускорение от многопоточности ?
|
|||
---|---|---|---|
#18+
Awaiterкак убедится, что алгоритм, написанный с async/await и Таск'ами действительно быстрее, чем синхронный. А с чего вы взяли, что код "с async/await и Таск'ами" будет всегда быстрее? Отнюдь. Я бы даже сказал так - если есть возможность обойтись без этого, нужно ей пользоваться. Зачем чрезмерно усложнять код? Плюсы от такого когда только в случае, когда ваш алгоритм работает с медленными устройствами, или долго ожидает ответа. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2014, 14:13 |
|
Как проверять ускорение от многопоточности ?
|
|||
---|---|---|---|
#18+
pation, Что ж, с удовольствием послушаю вашу версию. П.С.: только убедитесь перед ответом, что вы понимаете разницу между ускорением, то есть уменьшением времени выполнения операции, от отсутствия ожидания, когда задача выполняется столько же времени, но вы просто не ждете ее окончания. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2014, 14:15 |
|
Как проверять ускорение от многопоточности ?
|
|||
---|---|---|---|
#18+
async/await - синтаксический сахар. Task - последовательность действий(задача), которую можно запустить асинхронно(в отдельном потоке) и которой можно управлять. Сам по себе запуск перенос одной задачи из GUI в отдельный поток, не ускорит выполнения задачи, но позволит создать более отзывчивый интерфейс. Прирост в производительности можно получить выполняя несколько задач одновременно. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2014, 14:38 |
|
Как проверять ускорение от многопоточности ?
|
|||
---|---|---|---|
#18+
cdtyjvЕдинственная причина по которой асинхронные задачи могут быть быстрее синхронных - лучшая загрузка процессора. Ты так ничего и не понял про экономию на ожидающий потоках. В ужасе читай про I/O Completion Ports . ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2014, 14:55 |
|
Как проверять ускорение от многопоточности ?
|
|||
---|---|---|---|
#18+
Алексей КcdtyjvЕдинственная причина по которой асинхронные задачи могут быть быстрее синхронных - лучшая загрузка процессора. Ты так ничего и не понял про экономию на ожидающий потоках. В ужасе читай про I/O Completion Ports .О, еще один. Ну давайте, расскажите сколько же составляет эта экономия. Мы все в свое время оттестировали в том числе и подход с SocketAsyncEventArgs вдоль и поперек на реальной 10-гигабитной сетке. И я скажу вам, что асинхронный сокет не выигрывал ни в одном сценарии. Самая быстрая модель - это обычный блокирующий сокет без всяких ухищрений. Если потоков (читай - соединений) становится уж слишком много, то надо переключаться на неблокирующий сокет с селектором. Так работает подавляющее большинство современных высокопроизводительных серверов. Все. Асинхронный сокет - это гомно на палочке. В общем, как я понимаю, вы целостно вообще не умеете рассуждать на тему перфоманса. То вам лишний поток с 1Мб стэка это трагедия, то вам IO-порты панацеей являются. Это называется "слышал звон, да не знаю, где он". ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2014, 15:36 |
|
Как проверять ускорение от многопоточности ?
|
|||
---|---|---|---|
#18+
cdtyjvИ я скажу вам, что асинхронный сокет не выигрывал ни в одном сценарии А какие именно сценарии вы тестировали? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2014, 15:45 |
|
Как проверять ускорение от многопоточности ?
|
|||
---|---|---|---|
#18+
cdtyjvЕсли потоков (читай - соединений) становится уж слишком много, то надо переключаться на неблокирующий сокет с селектором. Так работает подавляющее большинство современных высокопроизводительных серверов. Все. Асинхронный сокет - это гомно на палочке Код, демонстрирующий это, тоже пропиетарный? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2014, 15:46 |
|
Как проверять ускорение от многопоточности ?
|
|||
---|---|---|---|
#18+
Ну так чего, кто нибудь знает про инструментарий, который мог бы наглядно показать разницу в синхронном-асинхронном коде ? :) Просто, иначе, написание асинхронного кода - весьма рискованно. Мало того, что усложняет код, но и выгода не ясна... ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2014, 17:06 |
|
Как проверять ускорение от многопоточности ?
|
|||
---|---|---|---|
#18+
Инструментарий называется микрохронометраж. Берёшь класс Stopwatch в руки и замеряешь то что тебе нужно и как тебе нужно. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2014, 17:14 |
|
Как проверять ускорение от многопоточности ?
|
|||
---|---|---|---|
#18+
AwaiterПросто, иначе, написание асинхронного кода - весьма рискованно. Мало того, что усложняет код , но и выгода не ясна ... Ну так и не пиши... те. Ъ! ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2014, 17:14 |
|
Как проверять ускорение от многопоточности ?
|
|||
---|---|---|---|
#18+
skyANAИнструментарий называется микрохронометраж. Берёшь класс Stopwatch в руки и замеряешь то что тебе нужно и как тебе нужно. Это не дело. Нужно видеть схему перед глазами. Нечто, похожее на план запроса SQL. Без плана запроса, оптимизация запросов - магия :) Так вот и с TPL. Нужно бы (очень бы хотелось) видеть четко графики того, что есть. Иначе написание многопоточного кода - это некое шаманство. Причем разработчик может думать о том, что код ускорится по одной причине, а на самом деле он ускорился из-за другого, но без графиков не будет понятно что именно произошло... Магия :) Просто хочется четкого подхода... понимания. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2014, 17:21 |
|
Как проверять ускорение от многопоточности ?
|
|||
---|---|---|---|
#18+
AwaiterskyANAИнструментарий называется микрохронометраж. Берёшь класс Stopwatch в руки и замеряешь то что тебе нужно и как тебе нужно. Это не дело. Нужно видеть схему перед глазами. Нечто, похожее на план запроса SQL. Без плана запроса, оптимизация запросов - магия :) Так вот и с TPL. Нужно бы (очень бы хотелось) видеть четко графики того, что есть. Иначе написание многопоточного кода - это некое шаманство. Причем разработчик может думать о том, что код ускорится по одной причине, а на самом деле он ускорился из-за другого, но без графиков не будет понятно что именно произошло... Магия :) Просто хочется четкого подхода... понимания.Так берите полученные значения и рисуйте с них графики. Ну или можете книжку почитать: Оптимизация приложений на платформе .Net ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2014, 17:27 |
|
Как проверять ускорение от многопоточности ?
|
|||
---|---|---|---|
#18+
AwaiterИначе написание многопоточного кода - это некое шаманство В общем то так и есть. Есть общие правила камлания, которые призывают духов производительности. Но всегда есть внешние обстоятельства, которые а) нужно учитывать б) могут неожиданно меняться. Например, в это время случайно дифрагментация запустилась, или какой-то процесс процессор сожрал, например, Касперский. Как считать то будете? А микробенчмарки для многопоточных/асинхронных приложений сделать вообще затруднительно. Они вообще зависят от вашего алгоритма. Так что будьте любезны указать, какой именно алгоритм вы собираетесь асинхронизировать. А потом только под него тесты можно писать. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2014, 17:30 |
|
Как проверять ускорение от многопоточности ?
|
|||
---|---|---|---|
#18+
Awaiter Причем разработчик может думать о том, что код ускорится по одной причине, а на самом деле он ускорился из-за другого, но без графиков не будет понятно что именно произошло... Магия :) Уже говорили - ускорения может и не быть. Если есть задачи, которые должны выполняться тихо и не заметно, не мешая юзеру - кидай в асинхрон. Если длинную задачу можно разбить на параллельные куски - кидай в асинхрон. Завтра, когда на десктопах будет по 80 ядер в процах, все будет кидаться в асинхрон ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2014, 17:56 |
|
Как проверять ускорение от многопоточности ?
|
|||
---|---|---|---|
#18+
PallarisУже говорили - ускорения может и не быть. Если есть задачи, которые должны выполняться тихо и не заметно, не мешая юзеру - кидай в асинхрон. Если длинную задачу можно разбить на параллельные куски - кидай в асинхрон. Завтра, когда на десктопах будет по 80 ядер в процах, все будет кидаться в асинхрон Я например получаю заметный, почти линейный рост производительности при загрузке данных в СУБД, увеличивая количество потоков до некоторого уровня, определяемого эмперически. Проверять легко - смотрим sql запросом, сколько строк добавилось в секунду. Правда ораклячие админы начинают звонить и требуют прекратить, поэтому приходиться делать это ночью. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2014, 18:16 |
|
Как проверять ускорение от многопоточности ?
|
|||
---|---|---|---|
#18+
ЕвгенийВЯ например получаю заметный, почти линейный рост производительности при загрузке данных в СУБД, увеличивая количество потоков до некоторого уровня, определяемого эмперически. Тут тоже - при загруженном серваке одна производительность, ночью - другая Правда ораклячие админы начинают звонить и требуют прекратить, поэтому приходиться делать это ночью. Простые юзеры начинают испытывать проблемы из-за многопоточности твоей, или что? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2014, 18:36 |
|
Как проверять ускорение от многопоточности ?
|
|||
---|---|---|---|
#18+
Pallaris Тут тоже - при загруженном серваке одна производительность, ночью - другая Думал сделать обратную связь, загружена БД - уменьшаем || и наоборот. Pallaris Простые юзеры начинают испытывать проблемы из-за многопоточности твоей, или что? Видимо не только простые юзеры, но и мирные москвичи :) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2014, 18:41 |
|
Как проверять ускорение от многопоточности ?
|
|||
---|---|---|---|
#18+
Awaiter[Просто хочется четкого подхода... понимания.Попробую максимально просто. У любой асинхронности есть всего навсего два варианта использования: 1) Если надо не ждать результата. Например, мне надо поклеить обои. Руки у меня по этой части из задницы, и я думаю, что у меня (ядро 1) это займет 2 дня. Но тут я решаю взять и попросить своего кореша (ядро 2), который это делает ничем не лучше меня. В итоге, как ни крути на саму задачу все равно уйдет два дня. Но в первом случае я сам это делаю (синхронно), и пока я этим занят, я не могут сделать ничего более. А во втором случае я попросил Васю сделать это за меня, а сам пошел заниматься чем-то другим. Это типичный паттерн в UI, когда юзер плыкает на кнопку, которая строит охреневший отчет. Если вы будете строить его синхронно - то заблокируете UI на все время его построения, и у юзера начнет нервно подергиваться глаз. А если вы это сделаете асинхрнонно, то пока отчет строится, юзер сможет заняться чем-то другим. Ускорения нет, просто меняется flow программы. 2) Если надо именно ускорить работу чего-либо, как правило - некоего вычислительного алгоритма. В моем примере это означает, что я позову не одного Васю, а, скажем, 4х. Один будет клеить обои на кухне, второй в детской, и т.д.. И в итоге на все-провсе уйдет на 2 дня, а (2 / 4 + обязательные накладные расходы) ~ 0.7 дня. Почитайте про закон Амдала . Как правило, такие задачи решаются через подход map-reduce - когда вы сначала бьете большую задачу на маленькие части, которые стараетесь выполнять максимально параллельно. А потом вы собираете результаты, и как-то агрегируете их. Второй подход - событийный. В нем оперируют потоками неких событий. Пример - фреймворк Storm (вбейте в гугле "twitter storm streaming"), разработанный в недрах Твиттера. Эти подходы именно что ускоряют работу алгоритмов. Вернее сказать - пытаются ускорить. На самом деле, далеко не всегда это возможно и оправдано. Но это уже другой разговор. Так вы про какую асинхронность спрашивали - про первую или про вторую? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2014, 19:16 |
|
|
start [/forum/topic.php?fid=20&msg=38762512&tid=1402411]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
77ms |
get tp. blocked users: |
2ms |
others: | 326ms |
total: | 479ms |
0 / 0 |