1. ActionScript / Говнокод #10004

    −109

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    inline public var length(getLength,null):Float;
    	inline public function getLength():Float {
    		return Math.abs(Vector3D.distance(this,new Vector3D()));
    	}
    	inline public var lengthSquared(getLengthSquared,null):Float;
    	inline public function getLengthSquared():Float {
    		return length * length;
    	}

    на самом деле haXe, но тут нет такой секции. источник: https://github.com/grumpytoad/jeash/blob/master/jeash/geom/Vector3D.hx

    Запостил: makc3d, 21 Апреля 2012

    Комментарии (18) RSS

    • майя обещали конец света, а говнокод все не падает
      Ответить
      • У меня главная страница почему-то обновляться перестала, например.
        Приходится смотреть через ?page=794
        Ctrl+R не помогает.
        Ответить
    • И пофиг, что distance по определению возвращает неотрицательное число...
      Ответить
      • ну если на создание двух экземпляров в getLengthSquared пофиг, то чего уже мелочиться
        Ответить
        • Там еще хорошая функция есть:
          inline public function negate():Void {
          x*=-1;
          y*=-1;
          z*=-1;
          }
          Ответить
          • чесгря затрудняюсь понять намёк. если *=-1 -> =- то http://wonderfl.net/c/A4Hc ) или ты предлагаешь scaleBy(-1)?
            Ответить
            • Зачем умножать два числа с плавающей запятой, если существует специальный оператор (унарный минус) для того, чтобы делать именно эту опрерацию. Т.е. x = -x эквивалентно x *= -1 но делает это без умножений.
              Ответить
              • есть, да, а толку? см вандервафельный код выше - с унарного минуса нет никакого профита. этот код, а так же код, от которого я его отфоркал, иллюстрирует простую мысль - основные тормоза в математике не от того, что кто-то использует * вместо - или / вместо >>, а от жирной прослойки в виде виртуальной машины, которая на каждом обращении к переменной неспеша засовывает циферки в свои недра, проверяя расположение звёзд и температуру на марсе, потом цпу выполняет над ними операцию за 0мс, а затем она столь же долго извлекает циферки обратно.
                Ответить
                • Так а какая разница, если сейчас в данной конкретной ситуации нет толку? Может завтра какой-нибудь разраб Тамарина с бодуна выпустит версию в которой сложение будет в стро раз дольше умножения. Нельзя же равняться на какие-то сиюминутные детали реализации. Есть логика в том, чтобы использовать правильный инструмент для задачи - поменять один бит в числе - проще, чем перемножить его с другим числом (для чисел с плавающей запятой разница может быть что-то типа двух порядков). Пока что виртуальная машина на столько медленная, что это мелочь по сравнению со всем остальным, но это ж не значит, что всегда так будет (ну я надеюсь :)).
                  Ответить
    • ActionScript
      inline

      я что-то не догоняю?
      Ответить
      • описание не читай - сразу отвечай
        Ответить
        • Тут в комментах разговаривают, что тут всё на виратульной машине. А нафига инлайн на такой?
          Ответить
          • ни Math.abs ни new Vector3D не заинлайнятся
            Ответить
          • Виртуальная-не виртуальная, а тесты показывают, что вызов функции жрет так сильно, что x > 0 ? x : -x выполняется в несколько раз быстрее, чем Math.abs(x);
            Ответить
          • А вообще да:
            - вычисляем квадратный корень для определения length,
            - потом берем его модуль,
            - потом это все возводим в квадрат (благо умножением)
            Как-бы взятие корня и умножение вместе с модулем стоило бы выкинуть нафиг,
            но зато, сцуко, соптимизировали - все функции inline
            Ответить
          • Нафига - потому, что JIT компилятор должен привязываться к байткоду, и даже если бы в нем была бы возможность оптимизации, то, в большинстве случаев изза того, что нужно каким-то образом знать из какого места программы выполняется код - особо ничего не заинлайнить. В haXe программист может "помочь" компилятору, и инлайн будет на уровне байткода. JITу это, конечно, не особо поможет, но все равно некоторые вещи можно существенно сократить.
            Тот же вызов функции, сам по себе, достаточно дорогой, чтобы инлайн имел смысл. Из смешных вещей, например, кустарная реализация целочисленного деления быстрее (раза в два, если не больше) чем то, что есть в виртуальной машине, но без инлайна не имело бы смысла, т.как вызов пользовательской функции был бы дороже.
            Ответить

    Добавить комментарий