Search
Write a publication
Pull to refresh
0
0
Send message
У меня компьютеру 10 лет стукнет в феврале и я и в fallout 4 и в gta 5 и даже в ведьмака третьего шпилил без проблем. На Core2Duo c 6гб оперативки, ага. Arma 3 на средних настройках тормозит правда.
Думается на том языке на котором информация была усвоена. Для меня, например, проблема объяснять математику на русском т.к. я просто не знаю как часть терминов переводятся. Так что у меня в голове навсегда целое число вместо integer и kernel вместо ядра и никак иначе.
Я говорю о том с чем работаю в данный момент. Проблема трансграничного банкинга в том что кроме ухода от налогов есть еще и вопросы национальной безопасности. Когда и банк и клиент резиденты одной страны все решают местные органы власти, и все просто. Как только в схеме появляется нерезидент все усложняется до невозможности. Пока вы один фрилансер на бирже это не так страшно. Когда вам надо нанять человека, оформить страховку или привлечь финансирование в любой стране вы вступаете в отоношения с государством, а там все очень серезно становится. Например львиная доля банков мира просто не работает с американскими клиентами, от слова вообще. И никаким техническим прогрессом это не решить, просто никто проблем не хочет.
Вы рисуете какую-то утопию оторванную от реальности. Любая уважающая себя страна имеет аналоги американских FATCA и FBAR, особенно в свете текущей ситуацией на ближнем востоке и в европе. И об эти федеральные законы разбивается вся идея «банков свободной экономики». Очень проблематично юридическому лицу легально работать с банком, резидентом другой страны. Банку в свою очередь еще труднее. Где гарантия что платеж заявленный как оплата фрилансеру разработки сайта не является финансированием покупки компонентов для взрывчатки. Stripe сейчас пытается обойти американские федеральные ограничения запустив Atlas, но там свои проблемы с оформлением банковских счетов для иностранных клиентов в Silicon Valley Bank и мне интересно как они их обойдут. Прослойка в виде американского юридического лица не спасает.
Ну с такой разницей в производительности меня Citus полностью устраивает для шардинга PostgreSQL. Плюс мне вообще не надо high-accessibility, мне надо fast-writes. Я не могу сейчас привести сравнение производительности распределенных MongoDB и PostgreSQL т.к. не делал этого еще, но чувствую первая от второго недалеко оторвется. У нас специфический софт, торговая платформа, мы в угоду производительности и латентности жертвуем объемами памяти, иногда даже отключаем hyper-threading (да да). Ну и все решения принимались после недель профайлинга на разных конфигурациях и т.д.
Приведу статистику live системы: 4 гигабита идет в shared memory между процессами, например, каждые 20 мс происходит обновление данных. Во время обновления на стеке создаются 5-6 двумерных массивов на 1000 элементов среди которых в основном структуры, но есть и инстансы классов, массивы нужны чтобы работать с отдельным снэпшотом данных в каждом из нескольких потоков обработки. Сами данные копируются из shared memory, немного конвертируются. Мержит снапшоты отдельный тред. Параллельно при вызове рендера из композишен таргет, в еще одном треде, последний снапшот копируется, обрабатывается и отправляется в видеопамять на рендер, чтобы на следующем вызове рендере обновить из текстуры интерфейс. Сам рендер естественно еще в двух тредах используя deferred context. И еще один тред готовит снапшоты для рендера, инкрементально накатывая диффы, чтобы не гонять снапшоты целиком. Чтобы все это работало без тормозов GC переводится в sustainedlowlatency чтобы не мешал, и приходится все кроме структур диспозить руками, т.к. там дочерта unmanaged ресурсов, присваивать указателям null насильно, т.к. для скорости часть переменных по возможности вынесены непосредственно из методов. Ну и все это по максимуму lock-free. Вот тут и пригождается все вплоть до unchecked, и большая часть данных гоняется в unmanaged через memmove и array.copy.
Вот и гуру подтянулся.
Ну, давайте так. .NET у нас для надежности, как бы странно это ни звучало. Запуск плагинов в отдельных процессах и AppDomain, контроль лайфтайма объектов и т.д. Очень много бонусов по сравнению с нативным кодом по скорости разработки. Система нагружена из-за реалтаймового обновления всех этих данных, поэтому математическиме расчеты и рендер интерфейса на GPU, куча native кода и т.д. Почему я для ненагруженной системы должен использовать Mongo если Postgres лучше, я не знаю. Память мы частично вручную контролируем, т.к. при таких объемах данных в много потоков, процессов и приложений GC не справляется, но отказавшись от сахара мы снизили потребность в памяти во много раз. Структуры, массивы на стеке, прямой доступ к памяти, Dispose всего и вся очень быстро исправляют ситуацию. Прототип, единичные вызовы могут и должны использовать Linq и все такое, но в 90% случаев от этого приходится отказаться.
И вы не поверите, в продакшен проектах 90% кода так написано, кроме некоторых тестов. Откройте исходники .NET, узнаете для себя много нового. Я неделю копался наверное после релиза.
Да уже готовлюсь морально к портированию…
Ну у меня в рабочем проекте MongoDB ГОРАЗДО медленнее PostgreSQL на записи json в базу. Конечно мы в PostgreSQL пишем бинарные данные и пакетами, но .NET MongoDB это просто шлак со всем своим LINQ. Т.е. в сотни раз медленнее, на потоке в 4 Гигабита json c 60000+ записей в секунду. Так что не знаю о чем вы.
А вот производительный код, который да, переоптимизирован немного, для сравнения:
                        if (*((bool*)(internalDataStorage + 3792)))
                        {
                            Interlocked.Add(ref totalStringLength, -*((int*)(internalDataStorage + 3796)));
                        }
#if TRACE
                        Logger.Trace("Report::set_ReceivingServerIdField()");
#endif
                        ((IComponentInternal)this).SetDirty();

                        Thread.MemoryBarrier();
                        allOk = true;

Это С#, ага.
Ну обеспечение атомарности операций компилятор на себя не возьмет. Что, например, вот отсюда можно сахаром заменить:

        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
        [MethodImpl(MethodImplOptions.NoInlining)]
        [SecurityCritical]
        public unsafe bool OpenMemoryMap(long memoryMapCapacity, out bool capacityIsSufficient)
        {
            bool lockTaken = false;

            RuntimeHelpers.PrepareConstrainedRegions();
            try
            {
	        this.CheckDisposed();

	        if (memoryMapCapacity <= 0)
	        {
	            throw new ArgumentOutOfRangeException("memoryMapCapacity", StringResources.MemoryMapCapacityOutOfRange);
	        }

            	bool result = false;

                Monitor.TryEnter(this.stateSyncRoot, ObjectStateTimeout, ref lockTaken);

                if (!lockTaken)
                {
                	// some code
                }
                else
                {
                	// some other code
                }

                return result;
            }
            catch (Exception exception)
            {
                Logger.Error(Helper.GetString(StringResources.UnableToAcquireViewHandlePointerBecauseException, this.name, exception));
                return false;
            }
            finally
            {
                if (lockTaken)
                {
                    Monitor.Exit(this.stateSyncRoot);
                }
            }
        }


P.S. Выход по таймауту в оригинале перехватывается отдельно, я укоротил немного.
У меня всегда двоякое впечатление от описания всяческого «удобного» синтаксического сахара. Мой C# после всех оптимизаций и фиксов вырос в безумный набор unsafe/fixed/CER/interlocked/methodimpl вуду, аж goto в двух местах есть. И мне сознательно пришлось отказаться от linq, foreach и т.д. почти везде. И когда я читаю производительный код на Java там та же картина. Вобщем без бенчмарков сравнение не катит. А ключевым моментом при выборе .NET/Java для меня был рантайм, AppDomain и все такое. У меня можно почти все и на VB портировать, сомневаюсь что что-то изменится.
В SharpDX .NET обертки из коробки есть.
В эффекте и переменные и constant buffer, описание типов, пара десятков шейдеров, несколько техник с 1-3 пассами.
Перешел на эффекты 4 месяца назад, стало удобнее. Но у меня жутко сложный рендеринг, т.к. я ускоряю WPF на GPU, в том числе и просто расчеты данных всякие. Эффекты компилируются из исходников хранящихся в embedded resource при загрузке сборок, нативные библиотеки для компиляции подгружаются автоматически в зависимости от платформы рантайма .NET. Как-то так.
И да, AFAIK, не Effects стали deprecated, а поменялась реализация компилятора, что-то убрали, что-то перекинули в другие места. Сам пайплайн не меняли.
Есть достаточно жесткий пайплайн: Effect->Technique->Pass, но если вы не будете использовать geometry shaders в принципе ничего не изменилось. hlsl файл компилируется в эффект, который содержит в себе техники и пассы. Считается что техника это завершенный рендер, но все можно сочетать в любых пропорциях. Если раньше приходилось отдельно применять VS/GS/PS шейдеры, то теперь можно выбрать технику и нужный пасс из эффекта и все настройки к контексту применятся пакетом. Для сложного рендера стало проще, для новичков сложнее вобщем. Мой совет, начинайте с D3D9, он проще и с него потом можно легко перейти на 11 когда возникнет реальная необходимость.
И еще всем фанатам Матрицы советую посмотреть как Нео и Морфиус оказываются в сенате, где «Джим Керри» выступает за запрет жестоких видеоигр. Но потом сенаторы в зале становятся агентами Смитами и прерывают выступление.

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Registered
Activity