Удваивается быстрее, чем плавания в C#?

typedef typename Tail::inUnion dummy;

Однако я не уверен, что реализация inUnion верна. Если я правильно понимаю, этот класс не должен быть создан, поэтому вкладка «fail» никогда не будет автоматически терпеть неудачу. Возможно, было бы лучше указать, находится ли тип в объединении или нет с простым булевым значением.

template  struct Contains;

template 
struct Contains >
{
    enum { result = Contains::result };
};

template 
struct Contains >
{
    enum { result = true };
};

template 
struct Contains
{
    enum { result = false };
};

PS: Посмотрите на Boost :: Variant

PS2: посмотрите на typelists , особенно в книге Андрея Александреску: Modern C ++ Design

53
задан Peter Mortensen 18 November 2017 в 01:09
поделиться

7 ответов

Короткий ответ, "используйте, какой бы ни точность требуется для приемлемых результатов. "

Ваша одна гарантия - то, что операции, выполненные на данных с плавающей запятой, сделаны, по крайней мере, в самом высоком участнике точности выражения. Так умножаясь два плавание сделано, по крайней мере, с точностью [1 112] плавание , и умножение , плавание и двойной было бы сделано, по крайней мере, с двойной точностью. В стандарте говорится, что" операции [с плавающей точкой] могут быть выполнены с более высокой точностью, чем тип результата операции".

, Учитывая, что JIT для.NET пытается оставить Ваши операции с плавающей точкой в точности требуемыми, мы можем смотреть на документацию от Intel для ускорения наших операций. На платформе Intel Ваши операции с плавающей точкой могут быть сделаны в промежуточной точности 80 битов и преобразованы вниз в точность, которую требуют.

От руководства Intel по C++ Операции С плавающей точкой <глоток> 1 (извините только имеют мертвое дерево), они упоминают:

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

, Что последняя точка важна как , можно замедлить себя с ненужными бросками, чтобы плавать и удвоиться , которые приводят к коду JIT'd, который запрашивает x87 выбросить от его 80-разрядного промежуточного формата промежуточные операции!

1. Да, это говорит C++, но стандарт C# плюс знание CLR сообщает нам, что информация для C++ должна быть применимой в этом экземпляре.

63
ответ дан Peter Mortensen 7 November 2019 в 08:29
поделиться

Я представил подобный вопрос несколько недель назад. Нижняя строка - то, что для x86 аппаратных средств, нет никакой значительной разницы в выполнении плаваний по сравнению с, удваивается, если Вы не становитесь памятью, связанной, или Вы начинаете сталкиваться с проблемой кэша. В этом случае плавания будут обычно иметь преимущество, потому что они меньше.

Текущий Intel CPUs выполняет все операции с плавающей точкой в регистрах 80 битов шириной, таким образом, действительная скорость вычисления не должна варьироваться между плаваниями и удваивается.

19
ответ дан Dave Tarkowski 7 November 2019 в 08:29
поделиться

Если загрузка & операции хранилища являются узким местом, тогда плавает, будет быстрее, потому что они меньше. При выполнении значительного количества вычислений между загрузками и хранилищами это должно быть о равном.

Кто-то еще упомянул, что избежал преобразований между плаванием & дважды, и вычисления, которые используют операнды обоих типов. Это - хороший совет, и если Вы будете использовать какие-либо математические библиотечные функции, которые возврат удваивает (например), затем сохраняя все, как удваивается, то будет быстрее.

7
ответ дан Mark Bessey 7 November 2019 в 08:29
поделиться

С 387 арифметиками FPU плавание только быстрее, чем дважды для определенных долгих повторяющихся операций как голова, журнал, и т.д. (и только если компилятор устанавливает управляющее слово FPU соответственно).

С упакованной арифметикой SSE, это имеет большое значение все же.

4
ответ дан Dark Shikari 7 November 2019 в 08:29
поделиться

Это указывает, что плавания немного быстрее, чем удваивается: http://www.herongyang.com/cs_b/performance.html

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

1
ответ дан torial 7 November 2019 в 08:29
поделиться

Плавания должны быть быстрее в 32-разрядной системе, но представить код, чтобы удостовериться, что Вы оптимизируете правильную вещь.

1
ответ дан Peter Mortensen 7 November 2019 в 08:29
поделиться

Я пишу трассировщик лучей, и замена поплавков на двойные для моего класса Color дает мне 5% ускорение. Замена поплавков Vectors на двойные еще на 5% быстрее! Довольно круто :)

Это с Core i7 920

7
ответ дан 7 November 2019 в 08:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: