Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Параллельные обработки часто упираются в синхронизацию и доступ к ограниченным ресурсам. И тут становится крайне важным быстро обрабатывать такие ситуации, что требует оптимизации
Мне кажется минимум синхронизации возможен только в очень изолированных задачах (чисто математичаских например).
Далее, если говорить о приложениях для пользователя — всегда есть метрика отзывчивости приложения на ввод пользователя. В таких ситуациях многопоточность может больше мешать чем помогать, ведь в пределе для максимально быстрого отклика (в виде результата, а не в виде прогрессбара)
Посмотрим какую долю и какого рынка займут LOB-приложения.
Ведь существуют операции где нельзя показывать прогрессбар, а нужно сразу реагировать на ввод, например изменением модели или каких-то параметров сцены.
Все таки интересно какого именно рынка заняли 100% долю LOB приложения.
Относительно частоты задач где очень желательна быстрая реакция приложения: [...] веб браузеры, терминалы ввода данных
Я несколько знаком с приложениями для бизнеса, но среди известных мне бизнесов, нет использующих LOB приложения. Из этого могу сделать вывод, что далеко не любому бизнесу они нужны.
LOB — line-of-business, приложение, выполняющее основные задачи предприятия.
In the context of computing, a «line-of-business application» is one of the set of critical computer applications perceived as vital to running an enterprise.
также как и на шарпе кроссплатформенную игру под андроид и айос
Одновременно используется одна из новых возможностей упрощенного хостинга Direct3D сцен в рамках приложения для той части, где визуализируются создаваемые модели.

Профайлер непосредственно этот контрол не дергал. В каком смысле что внутри?
Больше всего времяни было кажется в базовой реализации Measure, могу уже не помнить
По вашему примеру, важно как минимум поменять:
1. Колонки должны быть не автогенеренные, а явно прописанные в xaml с указанным размером
2. Их должно быть хотябы 10 штук
3. Часть из них, доблжы быть типа datagridtemplatecolumn, c Combobox внутри
4. Колонки должны быть забинжены на данные
5. В гиде должны быть разрешены редактирование и сортировка
Можно еще добавить (хотя и не обязательно, и наверное не стоит вам тратить на это время):
1. Визуальные стили на лист
2. Конвертеры в биндинге
3. В идеале добавить datagridtemplatecolumn с datetime picker и numericupdown из codeplex
4. В datagridtemplatecolumn использовать разные темплейты для редактирования и просмотра.
VirtualizingStackPanel.VirtualizationMode="Recycling"так и вообще визуальное дерево не меняется при перелистывании.
Мне кажется портирование с C# на С++ может стать трендом будущих разработок.
Математика например слабо завязана ни инфраструктуру.
Работа с файлами может сравнительно легко переведена на схожую C++ инфраструктуру.
Проблема не в I\O, а в быстрой раскладке файла в тот вид с которым вы сможете работать.
Я чаще сталкивался с тем что производительность упирается не в скорость работы stream-a, а в скорость обработки прочитанного из него.
Как правило, задачи стоят несколько сложнее чем сортировка мегабайта во время чтения.
Да и мегабайт на диске как правило архивированный тем или иным способом, поэтому развернутый в объектную модель может занимать в десятки, а то в сотню раз больше памяти чем занимал на диске.
Типичными задачами будут распокавать, так или иначе интерпретировать сожержимое, собрать из этого содержимого объекты, построить индексы на них или связать их тем или иным способом. Непосредственно чтение файла из этого занимает малую долю.
Вот смотрите, HDD умеет отдавать данные со скоростью примерно 80 Mb/s, SSD так вообще 300 Mb/s, эта скорость вполне реальна если просто брать данные с носителя в память как есть.
И вы хотите сказать что сжатый структурированный структурированный поток данных распаковывается и раскладывается в объектную модель параллельно процессу чтения, с той-же скоростью?
Если так, хотелось бы узнать, в каких именно задачах скорость обработки входного потока в 80 Mb/s-300 Mb/s вызывала проблемы?
по такой логике копирование архива и распаковка архива должны занимать почти одинаковое время, но это не так.
Упакованный структурированный файл, который нужно разложить в объектную модель, а не storage базы данных формата оптимизированного до такой степени, что времени на его обработку практически не требуется. Конечно там будет все упираться в железо.
И да, простой пример: по такой логике копирование архива и распаковка архива должны занимать почти одинаковое время, но это не так.
Если так, хотелось бы узнать, в каких именно задачах скорость обработки входного потока в 80 Mb/s-300 Mb/s вызывала проблемы?
Тут упремся в железо без вариантов. Если есть возможность видео лучше пожать.
Есть смысл построить индекс на теги.
можно попробовать брать поток в память прямо с камеры по USB\Firewire (или как она подключается), сжимать и уже потом класть на диск…
А если надо многократно сканировать надо одни и теже фотографии, которые могут немного меняться, то индекс должен бы окупиться, если правильно прописать его обновление.
Кстати, если вы не выжимаете предельную скорость из вашего HDD, то С++ думаю помог бы ее выжать.
Собственно говоря в ReadFileEx есть OVERLAPPED чтение и lpCompletionRoutine
msdn.microsoft.com/ru-ru/library/windows/desktop/aa365468(v=vs.85).aspx
Что, как я понимаю, тоже позволит активировать ваш обработчик.
Смотря как часто этот код выполняется, чем чаще, тем больше будет доля…
Безусловно прыжков и ужимок будет больше, но это будут ваши прыжки и ужимки, о которых вы точно будете знать что они делают, а не прыжки и ужимки дотнета.
ReadFile, насколько я — как именно ReadAsync делает свое волшебство.Я имел ввиду количество вызовов необходимых для инициализации чтения чанка.
C одной лишь разницей,- я знаю что ReadAsync(и любое другое дотнетовское чтение файла) в конечном счете вызовет ReadFile
ReadFile.При больших чанках процент очень малый.
ReadFileEx например можно вызывать и из C#
Но я честно говоря не уверен что byte [] lpBuffer отмаршалится без дополнительных издержек.А я уверен, тупо буфер пинится (выставляется флаг) и передается указатель.
Я незнаю сколько именно это добавит производительности в процентах, но точно знаю что прочитать файл на С++ можно меньшим количеством исполняемого машинного кода, чем будет выполнено в System.IO.FileStream.Read
1. Сборщик мусора в С++ НЕ НУЖЕН! Точка.
Добавлю ещё к выводу: С++ и С# это разные языки с разными задачами. Их бесполезно сравнивать. Вот замените цвет текста у кнопки на С++ и С#. А после нажатия на эту кнопку, производится поиск обратной матрицы размером 100000*100000. И какой язык для этого лучше? ;)Очевидно C, без плюсов ;)
Но на этом все.
ВыходнойПоток << "Меня зовут " << имя;
в STL: wstring, u16string, u32string — все есть, все прекрасно.
typedef basic_string<char16_t> u16string
var e = list.GetEnumerator() и тадам e.Current ==null, а чтобы получить первое значение нужно сказать e.MoveNext(). Кто мне сможет чем разработчики руководствовались?
Если итератор пустой (сиречь ссылается на пустую коллекцию) то в C++ он равен end и проблем никаких.
Получить итератор и не начать проход по коллекции — нарушение принципа объявление переменной там где это надо. но не раньше.
Пишем такой код:
for (var iterator = list.GetEnumerator(); iterator.HasNext(); iterator.MoveNext()){
Обработка
}
На основе опыта, основанного на доступе по индексу я ожидаю, что если я попал в тело цикла, то для начало работы с элементом мне больше телодвижений делать не надо нарушается. Причины такой логической нестыковки не понятны.
HasNext и (б) типизованные итераторы реализуют IDisposable, который надо не забыть обработать. using(var iterator = list.GetIterator())
{
while(iterator.MoveNext())
{
//обработка
}
}
Согласен, что да. может и не быть. Но это не упрощает написание кода, а только усложняет.
Да-да, но получается, что используете цикл с предусловием в любом случае, не всегда это идет коду на пользу.
foreach. Я просто показал вам, как решить вашу конкретную задачу.Иными словами, основной мой посыл: «работа с итераторами в C# проще, чем в C++» требует серьезных примеров.
IEnumerable<ValidationError> Validate()
{
if (Name == null) yield return ValidationError.FromProperty("Name");
if (Text == null) yield return ValidationError.FromProperty("Text");
if (Price < 0) yield return ValidationError.FromProperty("Price");
}
И да и нет. Да — это проблема моего опыта, тут спора нет. Но это и проблема и C#, т.к. нарушение общего стиля увеличивает количество ошибок в коде новичков, а мы вроде как хотим это избежать.
Индекс в цикле это такой же итератор.
for (var iterator = list.GetEnumerator(); iterator.MoveNext();){
...
}
Код вызова:
Task task = new WebClient().DownloadStringTaskAsync(«microsoft.com»); task.Wait(); // Здесь мы ждем завершения задачи, что блокирует поток TextBox.Text = task.Result;
//на время вызова существующий поток, скорее всего, будет "отпущен" и сможет выполнять другие задачи
TextBox.Text = await new WebClient().DownloadStringTaskAsync(«microsoft.com»);
Т.к. в C# потоки это обертка над потоками системы, то я не вижу принципиальных различий между потоками в C# и С++
Ну так и future это тоже абстракция уровнем выше.
await в C# — это не синтаксический сахар к task.Result (который, в свою очередь, ведет себя так же, как QFuture::result()). Ваш макрос приведет к тому, что поток, в котором идет выполнение, будет заблокирован до получения результата из future. А await выпихивает весь остаток метода в continuation, причем аккуратно захватывая используемые объекты и следя за жизненным циклом.await — что стало с потоком?Поток вызывает метод асинхронно и продолжает любую свою работу.
void someFunc()
{
//some code
//мы в потоке 1
TextBox.Text << await (WebClient().DownloadStringTaskAsync("http://microsoft.com")); //что стало с потоком 1? какой конкретно код он выполняет? куда делся код, находящийся ниже по функции?
//some code
}
Code1();
TextBox.Text << await (WebClient().DownloadStringTaskAsync("http://microsoft.com"));
Code2();
Code1 и Code2? Из ваших слов у меня создается ощущение, что после Code1, но в произвольный момент по отношению к Code2 (т.е., в том числе и после выполнения Code2). Я правильно вас понял, или как-то иначе это устроено?var page = await GetPageFromWikipedia(someterm);
var terms = page.GetOutgoingTerms();
var linkedPages = await Task.WhenAll(terms.Select(t => GetPageFromWikipedia(t)));
await система может полностью освободить поток для другой работы, что позволяет такие таски запускать сотнями и тысячами.Эм… поток это набор инструкций, они либо выполняются либо нет и третьего не дано. Соответственно поток либо выполняется, либо блокирован.
await в C# — он выходит из метода в этой точке, возвращая управление системе, и вешает «остаток» метода (в виде continuation) на «когда-нибудь потом».Это уже сложнее, чем я думал, но если я снова придумаю ответ чамберлену, то это уже будет отдельная статья. Т.к. тут придется сидеть — думать.
Т.е. код показанный вами выполняется после завершения await… но при этом, поток уходит в пул.
мы свершаем прыжок в конец функции, при это сохраняем состоянии стека и указатель на текущую инструкцию… Громоздко и сложно.
Проще блокировать поток, если за время блокировки пул потоков переполнится, то выводя такой поток из пула, а на его месте создаем новый, по окончании метода этот же поток убивается.
Проще блокировать поток, если за время блокировки пул потоков переполнится, то выводя такой поток из пула, а на его месте создаем новый, по окончании метода этот же поток убивается.
И конкретно здесь мне интересно знать для await\async и рядом связанных.
Этот механизм, как мне показали, удобен для асинхронных вызовов. Целевая ниша асинхронных вызовов: не частые внешние запросы, но с возможной(!) длительной обработкой.
Вся хитрость тех примеров, что привел привел уважаемый lair и ребята из msdn заключаемся в том, что этот код, который в плюсах нужно было бы запускать в другом потоке, можно записать в вызывающем.
async/await — это всего лишь синтаксический сахар вокруг продолжений (continuations). Да, он очень умный, да, он разворачивает эксепшны, следит за жизненным циклом объектов и контекстом синхронизации, но это всего лишь удобная обертка вокруг Task.ContinueWith().webClient
.ReadStringAsync()
.ContinueWith(FindParent)
.ContinueWith(parentUri => new Request(parentUri).ReadAndParse(n+1))
CalculateFibonacciAsync может внутри себя открывать другой поток, в нем запускать вычисление, а по его завершению возвращать поток в пул, а результат — потребителю. А уж упомянутая Stream.ReadAsync — открывать асинхронную операцию чтения, вешать делегат на ее завершение, и не трогать потоки вообще; причем в зависимости от нижележащей системы, того, что она поддерживает, и банально типа потока, эта асинхронная операция чтения может быть реализована через совершенно разные вызовы API — но для потребителя это все равно всего лишь обещание байтового массива когда-то в будущем. А при чтении из потока в памяти (который просто абстракция над буфером) результат будет просто синхронным — но пользователь снова не заметит разницы.var selectedOrders = from o in context.Orders
where o.Freight > 30
orderby o.ShippedDate descending
select o;
http://localhost:12345/Northwind.svc/Orders?Orderby=ShippedDate&?filter=Freight gt 30
И все-таки С++ поддерживает работу со «строками, юникод, итераторы и кучу всего еще» в STL.
STL есть в базе, везде и никаких boost-ов для этого не нужно.
yield уже все написали)В своем же проекте можно использовать те библиотеки и итераторы что устраивают вас.
Я согласен с тем, что подключив произвольную библиотеку есть шансы на то, что там будут использоваться не стандартные строки и итераторы(об этом я писал в статье в соответствующем разделе), но это вопрос к тем, кто писал эти библиотеки и к истории, в своих же проектах вполне реально придерживаться стандартов.
Борьба всетаки не с языком, а с некоторыми библиотеками, далеко не все из которых обязательно использовать.
Конечно здесь и сейчас прикладную задачу быстрее решить на C#, и если не думать на перспективу, то это вполне разумный выбор в большинстве проектов которые нужно сдать и забыть. Но если попробовать спрогнозировать развитие отрасли, то возможно ценность независимости от платформы и производительности окажется выше, чем быстрое решение прикладной задачи?
Сильная реорганизация, смена приоритетов в Микрософте и следующая за ней заморозка развития .net.
Переход заказчика на что-то вроде Эльбруса (сценарий конечно фантастический, но может когото он и постигнет) Да и кто знает какие платформы появятся через 3-5 лет…
Возросшие, со времянем эксплуатации, объемы данных и вычислений при недостатчном росте производительности железа (наиболее вероятный сценарий в случае если за эти 3-5 лет количество данных сильно увеличивается)
Желание заказчика перейти на «зеленые технологии» с потреблением 20w на рабочее место (а вдруг?)
Я бы дал примерно 30% на то что один из пунктов может случиться в течении 3-5 лет и нанести серъезный урон проекту.
нет, но заметно дешеале
Тут вопрос куда упремся и того насколько верно мы предсказали изменение объемов данных у заказчика.
Вы возможно не часто пользовались .net приложениями на какихнибудь Atom-ах…
Например года 3 назад в моей статистике прошла волна закрытий ASP.NET проектов, предназначенных для «внутреннего пользования» и некоторые библиотеки были переписаны с C# на С++ в целях повышения производительности и совместимости с iOS\MACOS.
И я пока не уверен, что все худшее для .net, в моей статистике, уже позади.
У вас наверное WinPhone)
Закрытие ASP.NET проектов в двух разных
В обоих случаях ASP.NET приложения были слишком ориентированы на исползование в Windows окружениии под IE.
Не совсем, на сколько я понял, asp.net был одной из немногих технологий позволявших завязаться на IE на столько сильно. Хотя конечно, никто не заставлял использовать такие его «приемущества», но видимо из-за них asp.net и был выбран.
Однако, если бы эти проекты были реализованы ввиде клиентов и сервера например на С++, а не в виде интернет приложений, то они имели бы намного больше шансов ожить на мобильных платформах в виде отдельных приложений.
Скорее ошибка оценки перспектив рынка. Если бы мобильные платформы не развились, проекты вероятно жили бы и по сей день.
Серверная часть С++ может быть написана со своим протоколом, это может сильно снизить трафик и упростить «парсинг» пакетов.
Пример показывает риски связанные с завязкой приложения на одну платформу.
Во втором из тех двух проектов, завязки на IE были не очень сильные и там даже успели адаптироваться под другние браузеры, но получилась ситуация в которой мобильные приложения стали удобнее, чем их веб решение поэтому рынок стал теряться и проект сворачиваться.
Если подходящий протокол с его реализацией найдется — конечно стоит взять его
И это уже ведет к рискам.
Но парадокс в том, что именно ради нее часто и выбирают C#, отрубая путь на другие платформы.
Например вы выбрали IOCP. Замечательная штука, но на других платформах ее нет в таком виде, и она будет реализована через другие механизмы(по сути будет эмулироваться) поэтому будет по-другому работать.
для C# такие практики не пропагандируются (разве что не тянуть импорты из dll) потому что такого рода пропаганда не выгодна Microsoft.
Выгода Microsoft в максимально глубоком и сильно связанном подсаживании на свою платформу.
как раз не в UI .net ведет себя лучше (а теперь — еще лучше) на других платформах.
Как же без UI на десктопе?
То есть вы в целом были готовы к тому что работа асинхронного I/O может отличаться на разных платформах.
Объявление конечно это не может не радовать, но когда же уже он выйдет и какие библиотеки в нем будут? Почему именно сейчас?
Тестировать приложение надо перед релизом.
Если писать более менее кросплатформенно,
Зависит от проекта и продукта, как правило от 4 месяцев до года, иногда больше.
Если коротко, суть их в том, что на С++ вы должны использовать только библиотеки включенные в стандарт С++ и кросплатформенные библиотеки, а всякие API операционной системы не использовать.
Предположим, раз в год. А сколько у вас период тестирования «перед релизом»?
Месяца 3-4.
Например для Qt должно бы работать…
doc-snapshots.qt.io/qt5-5.4/highdpi.html
3. Возросшие, со времянем эксплуатации, объемы данных и вычислений при недостатчном росте производительности железа (наиболее вероятный сценарий в случае если за эти 3-5 лет количество данных сильно увеличивается)
8. Риски
Для веб бэкэнда используется в основном php
Ведь никто не мешает писать сайты-клоны на ASP.NET, никто не мешает создавать хостинги блогов на ASP.NET
На самом деле вопрос скорее в том почему ниша оказалась занята PHP?
На самом деле вопрос скорее в том почему ниша оказалась занята PHP?
Первые версии ASP появились примерно в тоже время что и первые версии PHP, да и к моменту выхода ASP.NET, нишу еще нельзя было назвать занятой.
Поэтому как пользователь могу лишь сказать что сайты на PHP по какой-то причине работали достаточно быстро, а на ASP.NET — медленно…
Смысл поста в том, чтобы избежать огульных суждений при выборе средств разработки.В самом посте кроме огульных суждений ничего нет.
Как вы определили это «большинство» проектов?
На С++ можно писать код, который заработает на всех мобильных устройствах.
Для веб бэкэнда используется в основном php, но я кстати пробовал писать веб бэкэнд на С++, это вполне реально, но я бы наверное не стал рекомендовать его.
Насчет процента пакетов nuget для С++, может быть дело просто в том что nuget ориентирован на .net, а не на С++?Что значит «ориентирован»? там есть пакеты и для C++, только их мало.
поэтому даже при идеальной реализации у него меньше шансов ее решить оптимально, чем у не-кривой ручной реализации, написанной под конкретную задачу.
Многое из перечисленного следствие изначально непросчитанной архитектуры и выбора технологий, то есть эти проблемы не возникают внезапно…
Кстати, не знаете ли вы проектов с ожидаемым временем развития 10-20 лет и более, написанных на Java? (или C#, было бы интересно посмотреть на них..)
Кстати, не знаете ли вы проектов с ожидаемым временем развития 10-20 лет и более, написанных на Java? (или C#, было бы интересно посмотреть на них..)
Я чаще встречался с другим поведением сборщика мусора.
Фундаментально сборщик мусора решает очень общую задачу, поэтому даже при идеальной реализации у него меньше шансов ее решить оптимально, чем у не-кривой ручной реализации, написанной под конкретную задачу. Менеджер памяти далеко не всегда может предсказать что захочет ваш код в следующий момент, а вы — можете.
Это печально, но думаю поправимо.
Многое из перечисленного следствие изначально непросчитанной архитектуры и выбора технологий, то есть эти проблемы не возникают внезапно… Сам по себе переход на unmanaged языки их конечно не решит, но и трудоемкость выправления таких приложений может быть соизмерима с их переписью.
Для той рыночной ситуации такая стратегия была вполне разумна, по крайней мере для не очень больших проектов, но рыночная ситуация постоянно меняется.
Пока на горизонте был рост производительности заниматься «ловлей блох» в с низкоуровневой оптимизацией не было смысла, это было бы просто убыточно потому что более производительное железо появлялось быстрее, чем писался оптимизированный код.
Я не уверен, что приложение работающее с системой через кучу прослоек, и пытающееся использовать одинаковый UI на всех платформах можно назвать полноценным.
Но, если угодно, тоже-самое можно сделать и на C++ используя Qt.
Очень мало веб фреймворков для С++, в результате многое придется писать самому, это все-таки дороговато.Почему же мало? Язык-то такой хороший и такой популярный…
Вот смотрите:
en.wikipedia.org/wiki/NuGet
нельзя серьезно говорить о том NuGet ориентирован на С++ если кроме Visual Studio под Windows он не поддерживает ни одну платформу
Даже .net на Windows прослойка.
Директивы условной компиляции в С++ используются даже в базовых заголовках. Примером кода можно привести массу, но примеров целостного приложения без директив условной компиляции вы не найдете.
Разве в википедии написана не правда?
Знаете, по степени агрессивности ваших высказываний мне кажется что вы тут на зарплате от Микрософта, и просто рекламируете его технологии, я прав?
Еще раз. Nuget не интегрирован ни с одной средой разработки С++ кроме тех, что распространяет микрософт.Еще раз: это не мешает использовать nuget где угодно.
Это только пока вашему коду ничего не нужно от системы. Когда что-то требуется .net код идет к системе через прослойки.
Вы правда в верите в то, что отсутствие интеграции не влияет на вероятность использования nuget?
Эта «куча» не собрана в одном месте.
Прямо без конверсий типы .net ложатся на типы iOS?
На самом деле модули Android NDK могут делать вызовы напрямую, без Java
Практический под любую _общую_ задачу (например задачу уровня реализованных в .net) мне удавалось найти библиотеку на С++ с помощью google :)
Ведь неправда же. Это невозможно реализовать, ведь на этапе компиляции еще нет данных для конверсии, они появляются только в рантайме. Вы же не с константными параметрами вызовы делаете.
Кому нужно по-быстрому написать, а производительность приложения не критична — пишут.
Их большинство возможно, но никак уж не «все».Все это больше 95%, у оставшихся 5% обычно задачи сильно специфические, что нет смысла рассматривать.
Если конвертировать до компиляции, то да, это реально, но я бы не стал называть .net приложением, то что получится в результате этой конвертации.
Если в приложении есть участки критичные к производительности то их перепись на С++ ускорит приложение.Такой участок один — человек. Надо не заставлять его ждать, делая приложение отзывчивым в любых условиях. Ты хоть представляешь как сделать так, чтобы приложение на C++ не тупило пока получает данные по сети. Причем кроссплатформенно?
Это ложь. В С++ можно создавать потоки и запускать в них асинхронно все что вам нужно.Только это не асинхронный код ;)
Очень мало веб фреймворков для С++,
Но в других областях «доплата» за использование С++,- заметно меньше чем в вебе.
И кстати, С++ — используется для веба например на ebay.com, посмотрите код его страниц, они достаточно часто обращается к некой eBayISAPI.dll
Мне кажется в первую очередь это нетерпимость к кривому коду. На C++ вполне можно завалить сервер кривым кодом, а это очень большой риск для веб сервера.
Managed-же языки, как правило, не в состоянии завалить сервер, вероятно это одна из основных причин, почему они предпочтительнее.
но вот изоляция внутри прикладного приложения уже отсутсвует, а веб сервер это прикладное приложение
То есть 15 лет назад, задачи парсинга, работы с XML и регулярными выражениями на С++ решались существенно дороже
За 15 лет конечно библиотек решающих все эти задачи стало намного больше, но ниша уже была занята, возможно дело в этом…
А на холодную так вообще минуту ждать можно.
Кэш у меня не был настроен (его вообще обязательно настраивать?)Чтобы быстро работало — да. Иначе каждая страница по 3-5 сек.
А есть ли примеры более менее известных, для сравнения?
Кстати, а что можно почитать по правильной конфигурации кэша дла Sharepoint 2013?msdn: technet.microsoft.com/en-us/library/jj219613.aspx
Думаю в вебе высокую нагрузку пока побеждают другими способами и эти способы пока окупаются, не знаю как долго такая ситуация сохранится. Возможно достаточно долго.
Думаю затратами на железо, энергию и место где все это железо находится.
Да. Но это на данный момент, особый интерес представляет как развитие пойдет дальше. В железе наметилась стагнация, к чему она нас приведет?
Однозначно С++ нужен в CAD отрасли пока все кады которые мне попадались имели С++-ный рендер, и С++- ную модель данных, по сути на .net были только элементы UI.
В реализации нектороых сервисов по обработке файлов ряда форматов.
В разработке встраимого ПО, там как правило и вариантов других нет.
Справедливости ради да, NodeJS используется как средство разработки встраимого ПО, правда не уверен что это подойдет для любых платформ.
Но раз все так хорошо, зачем развивают С++, откуда вообще эти планы на С++17?
Не скажу точно.
Я как-бы пытаюсь разобрать именно долгосрочные перспективы, не станет ли С++ более актуальным через 3-5 лет?Очень сомневаюсь. managed платформы развиваются быстрее, а программисты до сих пор — самые дорогие компоненты софтверных решений.
Особенно если производительность железа не сильно вырастет…
Продолжил бы, что для десктопной программы, как правило, быстрый отклик важнее чем для серверной.
Я бы правда не стал говорить что большинство, но действительно много эмбеда используют C причем зачастую вкупе со статической работой с памятью. С++ добавляет некоторый оверхед относительно С, и на дохлом эмбеде это проявляется.
Продолжил бы, что для десктопной программы, как правило, быстрый отклик важнее чем для серверной.Какие-то расчеты, то никто в здравом уме не будет их запускать в UI потоке. Поэтому быстрый отклик получается когда используешь асинхронные операции, чтобы в UI потоке не ждать пока прочитается файл или выполнится запрос к веб-сервису.
Я как-бы пытаюсь разобрать именно долгосрочные перспективы, не станет ли С++ более актуальным через 3-5 лет? Особенно если производительность железа не сильно вырастет…
Есть еще немало «больших игроков» десктоп-приложений. Они по большей части сидят на С++ и исправно переходят на более свежие компиляторы, поддерживают новые платформы.
Даже Микрософт пока не спешит переводить свои десктопные продукты на .net…
не-WPF рибоны в офисе у меня зародили сомнения в том, что микрософт уверен в перспективности технологии
Декстопные приложение уходят на Workstation, где им и место ну и плюс игры.
плюс игры.
Пока Workstation на вебе есть в лучшем случае для бухгалтеров и документооборота.
Даже офис приложения на вебе не смог занять нишу офиса в виде приложения для десктопов и мобильных устройств.
Что вы понимаете под «workstation»?
Я имел ввиду рабочие места дизайнеров, конструкторов, разработчиков ПО, и думаю не только их.
А чьи рабочие места в вашем понимании входят в энтерпрайз, почему конструктора например не входят?
А как насчет Word, Excel, Visio?
Кстати наверняка на смартфоне вы используете приложение клиента, а не веб интефейс. А если так, — не задумывались, — почему?
Но так ли много новых именно областей появилось для энтерпрайз?
Наверное я плохо сформулировал, имел ввиду что среди Декстопных приложений остаются только нужные на Workstation, а приложения более уместные на планшетах и телефонах — отмирают на десктопе.
Но при этом и Workstation приложения не появляются на мобильных устройствах, то есть рынок просто делится.
И именно поэтому веб приложения проигрывают многим десктопным приложениям
Еще можно добавить отзывчивость интерфейса.
Я кстати думаю что именно приложения для смартфонов и планшетов отобрали часть рынка у веб приложений.
С ними все не однозначно.
Если приложение должно что-то делать с данными на вашей файловой системе (а таких приложений не так и мало) то веб приложения начинают сильно проигрывать.
Она потенциально может быть выше, т.к. больше шансов ответить без задержки на ввод из-за меньшего количество прослоек и задержек.
Это только потому что у gamail есть и мобильный и веб клиенты. А вот если бы не было, то может вы бы и перешли на другую почту, ради удобства мобильного пользования.
Иными словами имеет место быть сегментация, а не уход с десктопа. То что подходит больше для десктопа остается на нем, а то что больше для мобильных платформ — идет на них.
Согласен, этот пример плохой. Стандарное приложение для почты вполне подойдет. Однако если бы это был какойнибудь менее стандартный сервис на котором вы не так плотно сидите, типа планировщика, листа покупок или еще чегонибудь то вполне возможно это былобы аргументом.
Обычно к сервису нужно предоставить и каких-то клиентов чтобы им пользовались, и тут появляется вопрос о таких средствах разработки этих клиентов, которые бы позволили затратить минимум усилий на поддержку новых платформ.
Если в вашем клиенте всроена рендерилка какихнибудь документов, то уже есть что делать кроссплатформенным.
Или же например поддержан каконибудь особый протокол работы с сервером
Да в любом относительно толстом клиенте, который делает что-то «свое» (а не только вызов функциональности ОС) появляется смысл в кроссплатформенности.
Dms и PLM системы появились очень давно, и не в вебе… они очень стары…
А какое у нее сейчас понимание? (видел немного разные трактовки...)
Часть С++ гемороя ушла, а фаза галопирующего роста IT направления подходит(а может и подошла) к концу. Вполне возможно что все это вызовет переоценку приоритетов.
Изоляция ОС от прикладных приложений конечно есть, но вот изоляция внутри прикладного приложения уже отсутсвует,
Не, ну почему, можно добавить логгинг в свое приложение и логить происходяшее там, дабы получать информацию о исключениях и местах где они произошли
Например утечки памяти в managed средах ловить не так и просто.
А некторые проблемы с избыточным потреблением ресурсов процессора, без профайлера, могут быть заметно менее очевыдны чем в случае С++.
То простые случаи. Более неприятные случаи когда:
— Утечки возникают из-за не освобожденных ресурсов системы, особенно взятых импортами из dll системы.
— В неправильной последовательности освобождаются COM объекты ( GC не знает в какой последовательности их освобождать, а типичный дотнет девелопер не приучен чего-либо освобождать, если у него нет метода Dispose)
— Кривой маршалинг при вызове импортов из dll. Тут скорее не утечка памяти, а просто ее порча со всеми вытекающими последствиями не менее страшными, чем на С++, но более неожиданными.
— С WPF ом тоже помню были утечки, которые трудоемко было отловитьОтловить утечки в .NET всегда легко, исправить не всегда. Все возможные утечки уже изучены и многие поправлены, так что в реальности не придется долго возиться blog.jetbrains.com/dotnet/2014/09/04/fighting-common-wpf-memory-leaks-with-dotmemory
Это скорее к языку. Например код: «instance.Name» на С++ однозначно обратиться к филду, а на С# легко может обратиться к проперти внутри которой может быть засунуты тяжелые вычисления. Были еще какие-то подобные примеры.
Я лишь привел примеры где отладка C# может представлять заметные проблемы.
Я лишь привел примеры где отладка C# может представлять заметные проблемы.Ты привел проблемы, вызванные кривым unmanaged кодом, который, кстати, в большинстве случаев на C++.
производительность «на глаз»
Конструкторы копирования принято писать достаточно быстрыми,
Мне кажется в первую очередь это нетерпимость к кривому коду. На C++ вполне можно завалить сервер кривым кодом, а это очень большой риск для веб сервера.
Возможно ее там уже и нет, к сожалению узнать это точно можно лишь покопавшись на самом сервере.А заголовки посмотреть?
Более того. Для ASP (который без .NET) до 2005 года существовал немаленький рынок COM (ActiveX) компонент, которые работали в серверном коде на VB и JS. Естественно все эти компоненты были написаны на C++.
А заголовки посмотреть?
Но в других областях «доплата» за использование С++,- заметно меньше чем в вебе.

Если вы точно уверены, что вам не надо будет выпускаться до того как будут устранены критичные глюки то можно работать и на RC.
Кстати интересно, а почему в 2010м активизировалась разработка фич С++, как вы думаете?
ваш код должен компилироваться компиляторами на других платформах, где самые новые фичи могут быть еще не реализованы.
Кстати интересно, а почему в 2010м активизировалась разработка фич С++, как вы думаете?
shared_ptr<cons<T> > xs(new cons<T>());
Простое освобождение памяти не может быть медленнее регулярного запуска GC с проходом по всем объектам, т.е. по сути тому же подсчёту ссылок + огромный оверхед на обход.Такие утверждения надо доказывать. Но если вы считаете, что GC все объекты обходит, то вряд ли вам стоит размышлять на эту тему.
Давайте всё-таки в 2015 году ссылаться на статьи не 2011 года и тем более не про стандартную библиотеку. Давно есть make_shared.И что? Структура издержек у подсчета ссылок другая, по сравнению с GC. В GC приходится платить за количество мусора в единицу времени. При подсчете ссылок надо платить за каждое присваивание (в том числе передачу параметра в функцию). Если это понимаешь, то легко найти реалистичный сценарий, когда smart_ptr проиграет по скорости GC в .NET и Java.
Вы не учитываете unique_ptr, аналога которого нет в обычных GC-языках.На одних unique_ptr ни одну интересную программу не напишешь.
И сравнивать нужно с GC топовых языков, а не нишевого OCaml.У топовых языков и GC получше.
Если некоторый механизм позволяет вам не освобождать память вручную — это сборка мусора.
И сборщик мусора собирает только забытую память. RAII собирает всё — от памяти до файлов и сетевых сокетов.
Отдельных статей требует рассмотрение выбора Java или же интерпретируемых языков. Они будут предпочтительнее, чем С++ или С# в некоторых случаях
Выбор между C++ и C#