2012-05-21 2 views
0

Недавно я задал вопрос о структурах и оптимизации некоторых перегруженных операторов.Усовершенствования оператора Vector2

The original question is here

Теперь, я принял эти улучшения в сердце (или некоторые/большинство из них), и я возвращаюсь со следующими функциями (не являющиеся членами функции, как я хочу, чтобы они были C уступчивыми, если это возможно) ,

inline Vector2& operator+=(Vector2 &a, const Vector2 &b) 
{ 
    a.x += b.x; 
    a.y += b.y; 
    return a; 
} 

inline Vector2 operator+(Vector2 a, const Vector2 &b) 
{ 
    a += b; 
    return a; 
} 

inline Vector2& operator*=(Vector2 &a, const float &n) 
{ 
    a.x *= n; 
    a.y *= n; 
    return a; 
} 

inline Vector2 operator*(Vector2 a, const float &n) 
{ 
    a *= n; 
    return a; 
} 

inline float operator*(const Vector2 &a, const Vector2 &b) 
{ 
    return (a.x * b.x) + (a.y * b.y); 
} 

inline Vector2 rotate(const Vector2 &a, const float &angle) 
{ 
    Vector2 out = a; 
    out *= cos(angle); 
    out.x -= sin(angle) * a.y; 
    out.y += sin(angle) * a.x; 
    return out; 
} 

(Обратите внимание, что я опустил вычитание, а другой оператор умножения, так как они были эквивалентны другим операторам, перечисленных здесь).

В настоящее время я не могу поверить в какие-либо улучшения. Я пропустил что-нибудь, что (потенциально) сделает эти функции, как они сейчас стоят, неэффективными?

ответ

0

Бессмысленно говорить об улучшениях без профилирования. Тем не менее, есть может некоторые возможности для улучшения здесь:

inline Vector2 rotate(const Vector2& a, const float &angle) { 
    Vector2 out = a; 
    out *= cos(angle); 
    const float sinA + sin(angle); 
    out.x -= sinA * a.y; 
    out.y += sinA * a.x; 
    return out; 
} 

здесь, вы кэшировать результат sin(angle) вместо вызова функции дважды. Но я действительно должен подчеркнуть, что перед тем, как попробовать какие-либо изменения, у вас должна быть система профилирования, чтобы вы могли понять, имеют ли они значение или нет, и оценить, действительно ли какие-либо улучшения действительно стоят. Компилятор может оптимизировать ситуацию, которая кажется неэффективной при просмотре исходного кода.

стоит знать о RVO and NRVO, copy ellision и, в C++ 11, move semantics. Также см. Это relevant article.

EDIT: Мой первоначальный ответ был сильно сломан, и этот существенно отличается.

+0

Есть ли у вас какие-либо предложения о том, где можно получить систему профилирования или как ее использовать? Если это помогает, я в настоящее время работаю с Visual Studio 10 (Ultimate). (Кроме того, ваш предыдущий код не совпадает с тем, что я использовал, требуется копия, потому что нам нужно сохранить исходные элементы из a, даже после того, как мы * = by cos (angle). Если я не пропущу что-то, что вы знаете.) Спасибо! – Serge

+0

@StefanZuefeldt код эквивалентен, вы можете проверить его. 'a' не изменяется, потому что вы передаете значение. Что касается профилирования, я ничего не знаю о VS. Я использовал gprof и valgrind для unix, плюс множество ручных тестов для профилирования. – juanchopanza

+0

@StefanZuefeldt Visual Studio 2010 Ultimate имеет встроенный профайлер. –

0

Я также обнаруживаю, что ваши + и * операторы странные. Вы вводите по значению, изменяете его в операторе, а затем копируете его в результат (и возвращаете его по значению). Возможно, что компилятор оптимизирует это (не уверен, хотя). Выполнение этой книги может быть быстрее, возможно, что-то вроде этого?

inline Vector2 operator+(Vector2 &a, const Vector2 &b) 
{ 
    Vector2 r; 
    r.x = a.x + b.x; 
    r.y = a.y + b.y; 
    return r; 
} 
+0

Благодарим вас за предложение; Мои исходные операторы сопровождались аналогичным форматом (за исключением того, что они не использовали const или не передавали по ссылке XD). Причина, по которой я делал это, заключалась в том, чтобы следовать правилам http://stackoverflow.com/questions/4421706/operator-overloading в разделе «Двоичные арифметические операции» ... , поскольку r = a + b автоматически создает временное значение (a + b), а затем копирует его в r. Однако + = не делает лишних копий, так как все делается по ссылке. Я должен был бы использовать профилирование, как они сказали выше, чтобы быть уверенным в том, что лучше всего. – Serge

Смежные вопросы