• Почему приложение x64 в два раза медленнее x86?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Хотелось бы понять в общих чертах откуда такая разница.

    Обычно ответ на этот вопрос проще всего получить с помощью профилирования, которое укажет вам где программа проводит время. Вам останется лишь понять, почему именно там.
    При использовании gcc это делается добавлением опции -pg к командам компиляции и линковки, запуску приложения и запуску gprof потом. Для VS наверняка тоже есть профайлер.
    Ответ написан
    Комментировать
  • Почему приложение x64 в два раза медленнее x86?

    iLeonidze
    @iLeonidze
    xbooster.ru
    Вам к RAM
    Ответ написан
    Комментировать
  • Почему приложение x64 в два раза медленнее x86?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Отвечать на этот вопрос без какой-либо дополнительной информации - это как гадать на кофейной гуще. Какой CPU - если это древний Pentium D с допотопным конвейером и глупыми регистрами - одно дело, а если это новейший Core i7 на Haswell - другое. Что до настроек - вот честно, "стандартные" вообще ни о чём не говорит. Я уже не говорю, что было бы не плохо указать количество опытов с максимальным и минимальным - вполне возможно глупые ОС с планировщиком как-то неудачно распределяют время. Любой ответ, который можно тут указать может быть техническим грамотным, но совершенно не соответствующий истине.

    Рискну предположить такой расклад - об оптимизациях мы почти ничего не знаем и делаем "стандартную" дебаговую сборку. В этих случаях транслятор вставляет в код специальные метки, по которым можно будет сопоставить инструкции с файлом и номером строки. Понятное дело, что в объектные файлы попадут и холостые циклы и бесполезные разыменования. Ни о каких кэшированиях или перестановках не может быть и речи - что попросили, то получили.

    Теперь давайте вместе подумаем о том, какие различия между x86-64 и x86. На самом деле, вопрос поставлен не очень корректно - x86-64 почти полностью включает в себя x86. Из изменённого - размер указателя (адреса), да немного переделана логика регистров (хотя все они на месте, просто добавилось ещё лишние несколько десятков) - теперь часть аргументов в функцию передаётся через дополнительные регистры, тогда как в x86 все идут через стек. Однако получить здесь преимущество не так уж и просто - процессор тоже не дурак, в случае линейной обработки информации (или любая длительная работа с небольшими участками памяти) он прекрасно всё кэширует и работа со стеком в общем случае не сильно медленнее работы с регистрами.

    Теперь смотрим на код. Что там? Куча адресной арифметики, немного функций, да и аргументов почти нет. 8 миллионов слов? Не думаю что рекурсия вынудит вылезти стеку за пределы кэша, так что есть подозрение о паритете архитектур в данном случае. Однако большое количество адресной арифметики и увеличенный размер адреса в битах... во сколько раз? В два раза?

    Ну да ладно, ясное дело, сложение реализовано за 1 такт. Скорее всего. Конечно, здесь вопрос процессора, но даже узнав модель будет сложно узнать наверняка, разве только синтетическим тестом (много раз обращаться по адресу - сумме двух случайных чисел). Да и Windows 8.1 никогда не был стандартом производительности (скорее с точностью наоборот), и VC++ никогда не был лучшим компилятором.

    Попробуйте gcc (меня разве только интересует откуда на Windows взялся gcc) с флагом -O3. И посмотрите машинный код для 64 бита и 32 бита (можно пользоваться objdump из binutils или посмотреть машинный код в IDE Visual Studio - точно расположение кнопки не помню, но можно поискать в менюшках). Скорее всего причина не одна, их множество. Так, вызов функции сопровождается сохранением контекста, тогда как в x64 регистров больше, больше и контекст. Собираем такие моменты по крупицам... Вот и получаем.

    P.S. Давным давно, разговаривал с преподавателем. Простая перекомпиляция под 64 бита ускорила код на 30%. Это был колхозный кодек, немного похожий на libx264 (от туда была сдёрнута часть кода). Естественно, проект собирался со всеми оптимизациями, со всем расширениями инструкций - со всем, чем можно. И сборка под платформу x86-64 (с SSE, MMX, FMA и прочие). Жутко наукоёмкий разношёрстный код (писали все - от зелёных аспирантов, до ровесников Страуструпа и профессоров университета) - туева хуча функций, структур, объединений и очень, очень много параметров, многие из которых передают в аргументы функций. Ну и целевая платформа - жутко порезанный и переделанный Windows Embedded - там просто не чего было планировать.
    Ответ написан
    Комментировать
  • Почему приложение x64 в два раза медленнее x86?

    @ichernob
    а не может быть это связано со страницами памяти и адресацией?
    Ответ написан
    Комментировать
  • Почему приложение x64 в два раза медленнее x86?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Скорее всего в x64 билде происходит какая-то лишняя работа с памятью. В любом случае проблема кроется где-то в работе с указателями и оптимизациями компилятора.
    Ответ написан
    Комментировать
  • Как объединить несколько фигур, оставив только внешние границы?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Заливать ничего не надо, для работы с полигонами есть специальные библиотеки:
    www.angusj.com/delphi/clipper.php
    Для частного случая с окружностями, когда с контуром не нужны никакие манипуляции, можно простым перебором искать сегменты, которые находятся в какой-либо окружности, и не рисовать их.
    Ответ написан
    1 комментарий
  • Как объединить несколько фигур, оставив только внешние границы?

    Алгоритмом заливки залить каждый полигон в отдельности, объединить по ИЛИ, получив объединенную фигуру, а затем пройтись любым алгоритмом выделения границы.

    Или интересуют более быстрые алгоритмы ?
    Ответ написан
    3 комментария
  • Как смазать линию?

    @xandox
    Используй свертку.
    В крадце - выбираешь окно (масив какой-то длины, 3,5,7) элементы которого некие коэфиценты. Этим окном проходишься по массиву. Новое значение элимента масива это сумма взешеных элиментов которые попадают в окно делнная на длину окна. Например что бы посчитать усреднить с соседями нужно окно [1,1,1]. Нужно только определиться, что делать с краями. Обычно их или игнорируют или считают так, что за концом следует начало, ну и на оборот. Надеюсь понятно объяснил. Если что спрашивай.
    Ответ написан
    Комментировать
  • Как смазать линию?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Кривая Безье + Алгоритм Ву
    habrahabr.ru/post/130873
    Ответ написан
    Комментировать
  • Как перевести древовидную структуру в строку?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    рекурсия или поиск в ширину (последнее желательно, но можно обойтись и обычной рекурсией если у вас дерево не сильно большой вложенности).

    function buildDOM (node) {
        var html = '<div node-id='+node.ID+'>';
        if (node.childrens.length) {
             node.childrens.forEach(function (childNode) {
                   html += buildDOM(childNode);
             }
        }
        return html + '</div'>;
    }
    Ответ написан
    2 комментария
  • Как перевести древовидную структуру в строку?

    barkalov
    @barkalov
    Ответ написан
    Комментировать
  • Angularjs как организовать сохранение данных

    TekVanDo
    @TekVanDo
    Javascript Developer
    Если используете Rest модель, то создайте resource servise пример
    Для того чтобы данные не терялись (отключенный интернет) можно дублировать их в local storage
    Ответ написан
    4 комментария
  • Как в GIT установить новый корень?

    Комментировать
  • Чем(язык/либа) модифицировать готовый excel файл на стороне сервера?

    Dunadan
    @Dunadan
    phpExcel поможет, но а) кушает много памяти б) для сложных файликов может "бить" форматирование. Мы довольно успешно работали с phpExcel с файликами до 6000 строк, дальше начинались уже проблемы по времени / потребляемой памяти.

    Если сервер под Windows, можно попробовать покопаться среди www.php.net/manual/en/refs.utilspec.windows.php .
    Ответ написан
    2 комментария
  • Чем(язык/либа) модифицировать готовый excel файл на стороне сервера?

    sanchezzzhak
    @sanchezzzhak
    Ля ля ля...
    xlsx, docx можно через php обрабатывать, это XML файлы

    Можно в ручную XMLReader + SImpleXML
    Можно поискать готовый класс например PHPExel но либа грамозкая...
    Ответ написан
    Комментировать
  • ООП в Objective-C концепция отправки сообщений вместо вызова метода, почему так?

    Потому что там нет компилированных "классов" как таковых, есть лишь список методов (в текстовом виде) и соответствие их функциям. Методы в objc это обычные C функции (типа IMP) с дополнительными параметрами self и _cmd.
    Классы это просто структуры с перечислением пропертей, методов, ivars, суперкласса и все остальное, а вызов метода происходит через поиск функции, соответсвующей селектору (сообщению)
    Ответ написан
    Комментировать
  • C#: какой есть хороший 3D движок для Windows Store приложений?

    xakpc
    @xakpc
    full-stack .net developer, CEO Leecero.com
    Обратите внимание на MonoXNA/MonoGame
    blogs.msdn.com/b/bobfamiliar/archive/2012/08/01/wi...
    Ответ написан
    Комментировать
  • ООП в Objective-C концепция отправки сообщений вместо вызова метода, почему так?

    @s0L
    В книге(Аарон Хилегасс) написано, что можно использовать оба способа, т.е:
    родной [OBJ method:args]
    равнозначен OBJ.method(args)
    но использовать лучше сообщения и это тоже не ясно.


    Квадратные скобки - это вызов метода/отправка сообщения.
    Через точку - это обращение к property. У property обязательно есть getter и setter, и название метода getter по умолчанию совпадает с названием property, поэтому такая конструкция работает.

    Идеологически конечно лучше не вызывать методы через obj.method, чтобы не вносить путаницу. Методы нужно вызывать [obj method], а к property обращаться obj.propertyName
    Ответ написан
    Комментировать
  • ООП в Objective-C концепция отправки сообщений вместо вызова метода, почему так?

    GxocT
    @GxocT
    Если вкратце, то при отправке сообщения вызывается C функция с переданными параметрами.

    Подробнее тут:
    blog.zhengdong.me/2013/07/18/a-look-under-the-hood...

    И тут, страница 37 и далее:
    www.defcon.org/images/defcon-16/dc16-presentations...
    Ответ написан
    Комментировать