VC ++ / C ++ Высокая производительность Многопоточный GUI для торговли - PullRequest
7 голосов
/ 13 мая 2010

Мне интересно узнать, на что обращают внимание опытные разработчики при разработке высокопроизводительного многопоточного графического интерфейса для платформы Windows. Я задаю этот вопрос в контексте разработки торговых приложений, в которых графические интерфейсы очень динамичны, а задержка приложения является проблемой.

Какие архитектуры вы видели, или вы бы порекомендовали просмотреть документ / представление MFC, чтобы реализовать шаблон наблюдателя в этом контексте. Я считаю, что документ / представление не будут использоваться из-за проблем с производительностью.

Какие конкретные соображения необходимо учитывать для компонентов / окон пользовательского интерфейса, которые обновляются в отдельном потоке, как в MFC, так и в Qt? Существуют ли общие правила, применимые ко всем библиотекам графического интерфейса?

Ответы [ 3 ]

9 голосов
/ 13 мая 2010

Вы смотрите в совершенно неправильных местах. «Затраты» на архитектуру документа / представления находятся в наносекундном диапазоне (в основном, доступ к данным через указатель).

Для сравнения, абсолютная максимальная частота, с которой вы можете существенно обновить экран, представляет собой частоту обновления монитора, которая обычно составляет 60 Гц (то есть один раз каждые 16,67 миллисекунды).

Чтобы сделать даже такую ​​частоту обновления значимой, вы не можете сильно изменить ни одно обновление монитора - если вы попытаетесь изменить слишком много, пользователь не сможет следить за происходящим.

Что касается многопоточности, то на сегодняшний день самый простой способ - это выполнить все фактические обновления окна в одном потоке и использовать другие потоки для выполнения вычислений и т. Д., Которые генерируют данные для обновляемого окна. Если вы уверены, что потоку не нужно выполнять много вычислений и т. Д., Обновление окна настолько быстро, насколько это возможно, довольно просто.

Edit: насколько C ++ против C #, это зависит. Я не сомневаюсь, что вы можете получить абсолютно адекватную дисплей производительность от любого из них. Реальный вопрос в том, сколько вычислений вы делаете за этими дисплеями. То, что вы упомянули, отображало в основном довольно близко к необработанным данным (цена, объем и т. Д.). Для этого C #, вероятно, подойдет. Я полагаю, что люди, с которыми вы общались, делают гораздо больше вычислений, чем это - и это настоящее исцеление Ахиллеса от .NET (или почти всего, что работает на ВМ). Из того, что я видел, для очень тяжелых вычислений C # и тому подобное не очень конкурентоспособны.

Например, в другом ответе я упомянул приложение, которое я изначально написал на C ++, которое другая команда переписала на C #, которое работало примерно в 3 раза медленнее. С тех пор, как я это опубликовал, мне было любопытно, и я немного поговорил с ними об этом, спрашивая, не могут ли они улучшить его скорость, чтобы быть по крайней мере близкими к C ++ с небольшой дополнительной работой.

Их ответ был, по сути, тем, что они уже проделали эту дополнительную работу, и это было не просто "немного". Переписывание C # заняло примерно 3 1 / 2-4 месяца. Из этого времени им потребовалось менее месяца, чтобы продублировать функции оригинала; все остальное время было потрачено (чтобы) сделать его достаточно быстрым, чтобы его можно было использовать.

Спешу предупредить, что 1) это только одна точка данных, и 2) я понятия не имею, насколько это близко к тому, что вы могли бы сделать. Тем не менее, он дает некоторое представление о замедлении, с которым вы можете столкнуться, когда (и если) вы начнете делать реальные вычисления, а не просто передавать данные из сети на экран. В то же время, быстрый взгляд показывает, что в целом он соответствует результатам на веб-сайте Computer Language Shootout - хотя имейте в виду, что результаты есть для Mono, а не для реализации Microsoft.

По крайней мере для меня реальный вопрос сводится к следующему: действительно ли ваша забота о производительности действительно обоснована или нет? Для примерно 90% приложений важно то, что код делает того, что вам нужно, 1026 *, и скорость выполнения не имеет большого значения, пока он не получает радикально * На 1028 * медленнее (например, в сотни или тысячи раз медленнее). Если ваш код попадает в эту (большую) категорию, C # вполне может быть хорошим выбором. Если у вас действительно есть веская причина для беспокойства по поводу скорости исполнения, то мне кажется, что выбор C # будет лотом более сомнительным.

3 голосов
/ 14 мая 2010

Я работал на стороне графического интерфейса торгового приложения.В принципе, все локальное (то есть не веб) достаточно быстро.C ++, C # или Java все подойдут.Основным недостатком использования C ++ является то, что он устраняет естественный барьер между кодом вычисления и пользовательским интерфейсом.Программисты до меня были немного неаккуратными, использовали C ++, и поэтому код вычисления и пользовательский интерфейс были несколько переплетены.Это усложнило порт Qt.

Многопоточность в основном не имеет отношения к пользовательскому интерфейсу.Однако он должен работать в своем собственном потоке, а это означает, что только интерфейс к механизму (ам) вычислений должен быть связан с возможностью вызова из других потоков.

3 голосов
/ 13 мая 2010

Поскольку вы упомянули в комментарии проблему выбора C ++ или C #, я собираюсь порекомендовать C # и особенно WPF (Windows Presentation Foundation). Теоретически, приложение C ++ имеет более высокий потолок производительности, чем приложение .Net, поскольку у него нет накладных расходов платформы .Net, с которыми приходится иметь дело. Но это также займет больше времени на разработку (вероятно) и будет более подвержен ошибкам и утечкам памяти.

Если вы собираетесь писать свои собственные элементы управления отображением, WPF (или даже WinForms) достаточно быстр, чтобы справиться с такого рода нагрузкой управления (если, как и на любом языке / платформе, он написан правильно). Более того, существует огромное количество доступных пользовательских элементов управления, которые делают именно такие вещи (отображая биржевые диаграммы и тому подобное), что сделало бы создание этого приложения намного быстрее, чем делать все самостоятельно с нуля.

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