i32 по-добри ли са за производителност?
Това всъщност е нещо фино. Ако потърсим някои скорошни показатели на ниво инструкции, например за SkylakeX, има в по-голямата си част много ясна липса на разлика между 64-битови и 32-битови инструкции. Изключение от това е делението, 64-битовото делене е по-бавно от 32-битовото, дори когато се разделят едни и същи стойности (деленето е една от малкото инструкции с променливо време, които зависят от стойностите на своите входове).
Използването на i64 за данни също прави автоматичната векторизация по-малко ефективна - това също е едно от редките места, където данни, по-малки от 32 бита, имат приложение извън оптимизирането на размера на данните. Разбира се, размерът на данните също има значение за въпроса i32 срещу i64, работата с големи масиви от i64 лесно може да бъде по-бавна, само защото е по-голяма, следователно струва повече място в кеш паметта и (ако е приложимо) повече честотна лента. Така че, ако въпросът е [i32]
срещу [i64]
, тогава има значение.
Още по-фин е фактът, че използването на 64-битови операции означава, че кодът ще съдържа средно повече REX префикси, което прави кода малко по-малко плътен, което означава, че по-малко от него ще се побере в L1 кодовия кеш наведнъж. Това обаче е малък ефект. Просто наличието на някои 64-битови променливи в кода не е проблем.
Въпреки всичко това определено не използвайте прекомерно i32, особено на места, където наистина трябва да имате usize
. Например, не правете това:
// don't do this
for i in 0i32 .. data.len() as i32 {
sum += data[i as usize];
}
Това води до голяма регресия на производителността. Сега не само има безсмислено разширение на знака в цикъла, но и побеждава елиминирането на проверката на границите и автоматичното векторизиране. Но, разбира се, няма причина да пишете такъв код на първо място, това е неестествено и по-трудно, отколкото да го направите правилно.
person
harold
schedule
04.08.2018
i64
иf64
? - person Stargateur   schedule 04.08.2018usize
иisize
са единствените типове с това свойство). - person trentcl   schedule 04.08.2018