<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Operatoren langsam, wie so...?]]></title><description><![CDATA[<p>Warum sind eigentlich operatoren langsamer als &quot;normale&quot; funktionen...?</p>
<p>ich möchte eine eine 3D Vectorklasse schreiben, lohnt es sich mit SSE oder mit 3DNow! zu implementieren? Welche operationen sollte ich als inline assembler implementieren?( Echtzeit grafik )</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/187375/operatoren-langsam-wie-so</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 17:55:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/187375.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 19 Jul 2007 07:38:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Operatoren langsam, wie so...? on Thu, 19 Jul 2007 07:38:25 GMT]]></title><description><![CDATA[<p>Warum sind eigentlich operatoren langsamer als &quot;normale&quot; funktionen...?</p>
<p>ich möchte eine eine 3D Vectorklasse schreiben, lohnt es sich mit SSE oder mit 3DNow! zu implementieren? Welche operationen sollte ich als inline assembler implementieren?( Echtzeit grafik )</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1328204</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1328204</guid><dc:creator><![CDATA[orkun]]></dc:creator><pubDate>Thu, 19 Jul 2007 07:38:25 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren langsam, wie so...? on Thu, 19 Jul 2007 07:41:35 GMT]]></title><description><![CDATA[<p>Wer sagt das sie langsamer sind? Kommt ganz auf deine Methode an, nicht? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> Und bevor du groß optimierst solltest du selbst mal feststellen ob eine Optimierung überhaupt notwendig ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1328207</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1328207</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Thu, 19 Jul 2007 07:41:35 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren langsam, wie so...? on Thu, 19 Jul 2007 07:42:40 GMT]]></title><description><![CDATA[<p>wie komst du darauf das operatoren langsamer sind als normale funktionen ?</p>
<p>MMX und konsorten sind fuer solche dinge ausgelegt. wuerde also schon sinn machen.</p>
<p>Meep Meep</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1328208</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1328208</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Thu, 19 Jul 2007 07:42:40 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren langsam, wie so...? on Thu, 19 Jul 2007 09:12:19 GMT]]></title><description><![CDATA[<p>Operatoren dienen einzig aund allein einer lesbareren Darstellungsweise des quelltextes, sind aber nach dem Kompilieren genau das gleiche wie Funktionen, wäre schwachsinn, wenn es anders wäre.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1328290</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1328290</guid><dc:creator><![CDATA[Krux]]></dc:creator><pubDate>Thu, 19 Jul 2007 09:12:19 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren langsam, wie so...? on Thu, 19 Jul 2007 11:21:16 GMT]]></title><description><![CDATA[<p>orkun schrieb:</p>
<blockquote>
<p>Warum sind eigentlich operatoren langsamer als &quot;normale&quot; funktionen...?...</p>
</blockquote>
<p>Da Operatoren normale Funktionen sind, sind sie auch nicht langsamer. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1328417</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1328417</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 19 Jul 2007 11:21:16 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren langsam, wie so...? on Thu, 19 Jul 2007 11:39:40 GMT]]></title><description><![CDATA[<p>Okay, dann muss ich wohl meine Frage anders formulieren...</p>
<p>Warum wird in Real Time Rendering oder Physik Engines auf operatoren verzichtet...?</p>
<p>Beispielsweise Havok Vectorklasse sieht so aus:</p>
<pre><code class="language-cpp">00001 #ifndef HAK_MATH_VECTOR3_H
00002 #define HAK_MATH_VECTOR3_H
00003 
00004 #ifndef HK_MATH_VECMATH_H
00005 #error Include &lt;hk_math/vecmath.h&gt; Do not include this file directly.
00006 #endif // HK_MATH_VECMATH_H
00007 
00008 namespace Havok { class Vector3; }
00009 
00010 struct hkVector3ExpressionPlus;
00011 struct hkVector3ExpressionMinus;
00012 
00013 #define HK_REF &amp;
00014 #define Const //const
00015 #define ConsT const
00016 
00017 class hk_Vector3
00018 {
00019         public:
00020 
00021                 HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR(HK_MEMORY_CLASS_CONSTRAINT, hk_Vector3)
00022 
00023                 inline hk_Vector3();
00024                 inline hk_Vector3(hk_real a, hk_real b, hk_real c);
00025                 inline hk_Vector3(const double*);
00026                 inline hk_Vector3(const float*);
00027 
00028                 inline hk_Vector3( const hk_Vector3&amp; v);
00029                 inline void operator=  (const hk_Vector3&amp; v);
00030 
00031                 /* expression operators */
00032                 inline hk_Vector3(ConsT hkVector3ExpressionPlus HK_REF v);
00033                 inline void operator= (ConsT hkVector3ExpressionPlus HK_REF v);
00034                 inline hk_Vector3(ConsT hkVector3ExpressionMinus HK_REF v);
00035                 inline void operator= (ConsT hkVector3ExpressionMinus HK_REF v);
00036 
00037                 /* accumulation operators */
00038                 inline void operator=  (const Havok::Vector3&amp;); //&lt;todo&gt; remove me
00039                 inline void operator+= (const hk_Vector3&amp; a);
00040                 inline void operator-= (const hk_Vector3&amp; a);
00041                 inline void operator*= (hk_real a);
00042 
00043                 inline void set(hk_real a, hk_real b, hk_real c);
00044                 inline void set_zero();
00045 
00046                 /* arithmetic operations - fast! */
00047                 inline void set_add(const hk_Vector3&amp; a, const hk_Vector3&amp; b);
00048                 inline void set_sub(const hk_Vector3&amp; a, const hk_Vector3&amp; b);
00049                 inline void set_cross(const hk_Vector3&amp; a, const hk_Vector3&amp; b);
00050 
00051                 inline void set_mul(hk_real r, const hk_Vector3&amp; a);
00052                 inline void set_mul3(const hk_Diagonal_Matrix&amp; a, const hk_Vector3&amp; b);
00053                 inline void set_mul3( const hk_Matrix3&amp; a, const hk_Vector3&amp; b ); 
00054                 inline void add_mul(hk_real r, const hk_Vector3&amp; a);
00055                 inline void set_interpolate( const hk_Vector3&amp; a, const hk_Vector3&amp; b, hk_real t);
00056 
00057                 /* transform */
00058                 void set_rotated_dir    (const hk_Rotation&amp; a, const hk_Vector3&amp; b);
00059                 void set_rotated_inv_dir(const hk_Rotation&amp; a, const hk_Vector3&amp; b);
00060 
00061                 void set_transformed_pos    (const hk_Transform&amp; a, const hk_Vector3&amp; b);
00062                 void set_transformed_inv_pos(const hk_Transform&amp; a, const hk_Vector3&amp; b);
00063     
00064                 /* inline versions of above */
00065                 inline void _set_rotated_dir    (const hk_Rotation&amp; a, const hk_Vector3&amp; b);
00066                 inline void _set_rotated_inv_dir(const hk_Rotation&amp; a, const hk_Vector3&amp; b);
00067 
00068                 inline void _set_transformed_pos    (const hk_Transform&amp; a, const hk_Vector3&amp; b);
00069                 inline void _set_transformed_inv_pos(const hk_Transform&amp; a, const hk_Vector3&amp; b);
00070 
00071                 /* length and distance */
00072                 inline hk_real dot(const hk_Vector3&amp; a) const;
00073                 inline hk_real length() const;
00074                 inline hk_real length_inv() const;
00075                 inline hk_real length_squared() const;
00076 
00077                 inline hk_real distance_squared_to( const hk_Vector3 &amp;) const;
00078                 inline hk_real distance_to( const hk_Vector3 &amp;) const;
00079 
00080                 inline void normalize();
00081                 inline hk_real normalize_with_length();
00082                 //void fast_normalize_e10(); // 10 bits valid
00083 
00084         /* element access */
00085             inline hk_real&amp; operator() (int a);
00086                 inline const hk_real&amp; operator() (int a) const;
00087 
00088                 inline       hk_real* get_real_pointer() { return &amp;x; }
00089                 inline const hk_real* get_real_pointer() const { return &amp;x; }
00090 
00091         public:
00092 
00093                 hk_real HK_ALIGNED_VARIABLE(x,16);
00094                 hk_real y;
00095                 hk_real z;
00096                 hk_real w;
00097 };
00098 
00099 inline Const hkVector3ExpressionPlus operator+ (const hk_Vector3&amp; a, const hk_Vector3&amp; b);
00100 inline Const hkVector3ExpressionMinus operator- (const hk_Vector3&amp; a, const hk_Vector3&amp; b);
00101 
00102 #endif // HAK_MATH_VECTOR3_H
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1328441</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1328441</guid><dc:creator><![CDATA[orkun]]></dc:creator><pubDate>Thu, 19 Jul 2007 11:39:40 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren langsam, wie so...? on Thu, 19 Jul 2007 12:03:03 GMT]]></title><description><![CDATA[<p>was willst du ? hier werden doch genauso operatoren verwendet</p>
<p>Meep Meep</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1328463</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1328463</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Thu, 19 Jul 2007 12:03:03 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren langsam, wie so...? on Thu, 19 Jul 2007 12:05:17 GMT]]></title><description><![CDATA[<p>orkun schrieb:</p>
<blockquote>
<p>...<br />
Warum wird in Real Time Rendering oder Physik Engines auf operatoren verzichtet...?</p>
<p>Beispielsweise Havok Vectorklasse sieht so aus:</p>
</blockquote>
<p>Also ich sehe da sehr viele Operatoren...<br />
(operator=, operator+=, operator-=, operator*=, operator(), operator+, operator-...)</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1328466</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1328466</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 19 Jul 2007 12:05:17 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren langsam, wie so...? on Thu, 19 Jul 2007 12:30:52 GMT]]></title><description><![CDATA[<p>Okay, also ihr denkt der Author hatte langeweile beim implementieren und kommentieren der Methoden:</p>
<pre><code class="language-cpp">00046                 /* arithmetic operations - fast! */
00047                 inline void set_add(const hk_Vector3&amp; a, const hk_Vector3&amp; b);
00048                 inline void set_sub(const hk_Vector3&amp; a, const hk_Vector3&amp; b);
00049                 inline void set_cross(const hk_Vector3&amp; a, const hk_Vector3&amp; b);
00050 
00051                 inline void set_mul(hk_real r, const hk_Vector3&amp; a);
00052                 inline void set_mul3(const hk_Diagonal_Matrix&amp; a, const hk_Vector3&amp; b);
00053                 inline void set_mul3( const hk_Matrix3&amp; a, const hk_Vector3&amp; b ); 
00054                 inline void add_mul(hk_real r, const hk_Vector3&amp; a);
00055                 inline void set_interpolate( const hk_Vector3&amp; a, const hk_Vector3&amp; b, hk_real t);
</code></pre>
<p>die sind wohl nur zufällig da... alles klar...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1328498</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1328498</guid><dc:creator><![CDATA[orkun]]></dc:creator><pubDate>Thu, 19 Jul 2007 12:30:52 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren langsam, wie so...? on Thu, 19 Jul 2007 12:34:54 GMT]]></title><description><![CDATA[<p>Vielleicht solltest du mal die Implementierung der Operatoren und Methoden miteinander vergleichen (da die als 'inline' definiert sind, solltest du sie auch vorliegen haben).</p>
<p>(PS: Vielleicht ist set_add() auch nur schneller, weil es zwei Vektoren auf einen Schlag aufaddieren kann - oder der Autor hatte tatsächlich Langeweile (oder keine Ahnung))</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1328503</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1328503</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 19 Jul 2007 12:34:54 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren langsam, wie so...? on Thu, 19 Jul 2007 12:37:24 GMT]]></title><description><![CDATA[<p>Dir ist schon klar, dass diese Funktionen durchwegs 3 Parameter haben während die Operatoren nur 2 Parameter haben?</p>
<p>Ich weiß nicht was ein set_add macht, aber es verlangt 3 hk_Vector3 Objekte. Das geht mit einem + schwer. Dass ein</p>
<p>add(a,b,c)<br />
uU schneller sein kann als ein<br />
add(a, add(b,c))<br />
sollte der Verstand von alleine erklären können.</p>
<p>PS:<br />
ein operator ist eine stinknormale funktion die für uns programmierer einfach nur etwas anders aussieht.</p>
<p>wir können zwar a+b schreiben, aber der compiler sieht hier ein a.operator+(b) oder ein operator+(a,b) - je nachdem. ersetzen wir den namen &quot;operator+&quot; nun durch &quot;foo&quot;:<br />
foo(a,b)<br />
sieht es doch fast wie eine normale funktion aus, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1328504</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1328504</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Thu, 19 Jul 2007 12:37:24 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren langsam, wie so...? on Thu, 19 Jul 2007 18:05:58 GMT]]></title><description><![CDATA[<p>orkun schrieb:</p>
<blockquote>
<p>Okay, also ihr denkt der Author hatte langeweile beim implementieren und kommentieren der Methoden:</p>
<pre><code class="language-cpp">00046                 /* arithmetic operations - fast! */...
</code></pre>
<p>die sind wohl nur zufällig da... alles klar...</p>
</blockquote>
<p>Vorab: Meinst DU wirklich, mit einem genervten Grundton läuft die Diskussion besser ?</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/26836">@Topic</a>: Ich wette, dass dieser Kommentar gar nichts mit Sprachfeatures/Eigenschaften zu tun hat, sondern der Autor (höchstens) eine optimierte Implementierung mit diesen Namen belegt hat.<br />
Genauso könnte da auch stehen:</p>
<pre><code class="language-cpp">00046                 /* arithmetic operations - slow! */...
</code></pre>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1328790</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1328790</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 19 Jul 2007 18:05:58 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren langsam, wie so...? on Thu, 19 Jul 2007 23:24:45 GMT]]></title><description><![CDATA[<p>orkun schrieb:</p>
<blockquote>
<p>Okay, also ihr denkt der Author hatte langeweile beim implementieren und kommentieren der Methoden:</p>
<pre><code class="language-cpp">00046                 /* arithmetic operations - fast! */
00047                 inline void set_add(const hk_Vector3&amp; a, const hk_Vector3&amp; b);
00048                 inline void set_sub(const hk_Vector3&amp; a, const hk_Vector3&amp; b);
00049                 inline void set_cross(const hk_Vector3&amp; a, const hk_Vector3&amp; b);
00050 
00051                 inline void set_mul(hk_real r, const hk_Vector3&amp; a);
00052                 inline void set_mul3(const hk_Diagonal_Matrix&amp; a, const hk_Vector3&amp; b);
00053                 inline void set_mul3( const hk_Matrix3&amp; a, const hk_Vector3&amp; b ); 
00054                 inline void add_mul(hk_real r, const hk_Vector3&amp; a);
00055                 inline void set_interpolate( const hk_Vector3&amp; a, const hk_Vector3&amp; b, hk_real t);
</code></pre>
<p>die sind wohl nur zufällig da... alles klar...</p>
</blockquote>
<p>Ich glaube du bist ein bisschen doof. Welche dieser Funktionen würdest du denn durch einen überladenen Operator ersetzen? Und welchen? Und wie?<br />
Willst du statt set_add einen operator + (std::pair&lt;hk_Vector3 const&amp;, hk_Vector3 const&amp;&gt;) machen oder wie stellst du dir das vor?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1328912</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1328912</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 19 Jul 2007 23:24:45 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren langsam, wie so...? on Fri, 20 Jul 2007 00:12:30 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Ich glaube du bist ein bisschen doof. Welche dieser Funktionen würdest du denn durch einen überladenen Operator ersetzen? Und welchen? Und wie?<br />
Willst du statt set_add einen operator + (std::pair&lt;hk_Vector3 const&amp;, hk_Vector3 const&amp;&gt;) machen oder wie stellst du dir das vor?</p>
</blockquote>
<p>ich denkmal das 'set_add' den operator+ und den operator= ersetzen soll.<br />
ich glaub der programmierer hat den aufwand mit den funktionen deshalb betrieben, um temporaere objecte zu vermeiden.</p>
<p>bin mir fast sicher das das ungefaehr so aussieht:</p>
<pre><code class="language-cpp">class hk_Vector3;

class hkVector3ExpressionPlus
{
   public:
      hkVector3ExpressionPlus(const hk_Vector3 &amp;v1, const hk_Vector3 &amp;v2) : vec1(v1), vec2(v2) { }

   const hk_Vector3 &amp;vec1, &amp;vec2;
};

inline const hkVector3ExpressionPlus operator+ (const hk_Vector3&amp; a, const hk_Vector3&amp; b)
{
   return hkVector3ExpressionPlus(a,b);
} 

class hk_Vector3
{
   public:
      ...
      /* expression operators */
      inline void operator= (ConsT hkVector3ExpressionPlus HK_REF v)
      {
         /* hier kommt der teil den ich mir denke */
         set_add(v.vec1, v.vec2);
      } 
      ...
      /* arithmetic operations - fast */
      ...
      inline void set_add(const hk_Vector3&amp; a, const hk_Vector3&amp; b)
      {
         /* hier wird er wahrscheinlich die addition und die zuweisung machen */
      }
      ...
};

/* damit kann man nu folgendes schreiben: */
hk_Vector3 a,b,c;

a = b + c; /* &lt;- schlussendlich wird dann hier vom kompiler implizit die 'set_add'-memberfunktion eingesetzt. 
somit wird das temporaere object, welches von 'b + c' erzeugt werden wuerde, vermieden. deshalb wahrscheinlich der kommentar mit 'fast'*/
</code></pre>
<p>und nachdem ich grad so schoen am traeumen bin, geh ich jetz schlafen.</p>
<p>gute nacht</p>
<p>Meep Meep</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1328929</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1328929</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Fri, 20 Jul 2007 00:12:30 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren langsam, wie so...? on Fri, 20 Jul 2007 07:53:50 GMT]]></title><description><![CDATA[<p>@Meep Meep<br />
jep, denke ich auch, die dinger werden ja auch &quot;expression operators&quot; genannt. imho eine sehr geile idee, komplexe operationen auf diese Weise effizient und lesbar zu machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1328999</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1328999</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Fri, 20 Jul 2007 07:53:50 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren langsam, wie so...? on Fri, 20 Jul 2007 13:14:41 GMT]]></title><description><![CDATA[<p>Hah, hab ich wieder mal das offensichtliche übersehen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Trotzdem würde ich das nicht so machen wenn ich will dass es unbedingt und auf jeden Fall schnell geht... ich persönlich finde da die &quot;set_add&quot; Funktion besser.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1329272</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1329272</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 20 Jul 2007 13:14:41 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren langsam, wie so...? on Fri, 20 Jul 2007 18:06:32 GMT]]></title><description><![CDATA[<p>orkun schrieb:</p>
<blockquote>
<p>Warum sind eigentlich operatoren langsamer als &quot;normale&quot; funktionen...?</p>
</blockquote>
<p>In der Theorie nicht, in der Praxis leider schon. Das hat vor allem mit den von Meep Meep bereits angesprochenen temporären Objekten zu tun, die Compiler nicht vollständig eliminieren können. Dort gab es immer mal wieder diverse Lösungsansätze. Alexandrescu hat auch mal etwas dazu verfasst, Stichwort Mojo. Ein bekannte Lösung für binäre Operatoren sind Expression Templates. Allerdings ist sowas weder elegant zu implementieren, noch einfach zu warten. Jedenfalls kann das ziemlich komplexe Ausmasze annehmen.</p>
<p>Sry wenn dich einige hier anmachen, aber deine Frage ist durchaus berechtigt.</p>
<p>orkun schrieb:</p>
<blockquote>
<p>ich möchte eine eine 3D Vectorklasse schreiben, lohnt es sich mit SSE oder mit 3DNow! zu implementieren?</p>
</blockquote>
<p>SSE bzw. 3DNow lohnt sich immer. Ob man das selber implementiert, hängt von den Fähigkeiten deines Compilers ab.</p>
<p>orkun schrieb:</p>
<blockquote>
<p>Welche operationen sollte ich als inline assembler implementieren?</p>
</blockquote>
<p>Gar keine. Aktuelle Compiler sollten entsprechende Intrinsics kennen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1329430</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1329430</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Fri, 20 Jul 2007 18:06:32 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren langsam, wie so...? on Fri, 20 Jul 2007 22:30:45 GMT]]></title><description><![CDATA[<p>groovemaster schrieb:</p>
<blockquote>
<p>orkun schrieb:</p>
<blockquote>
<p>Warum sind eigentlich operatoren langsamer als &quot;normale&quot; funktionen...?</p>
</blockquote>
<p>In der Theorie nicht, in der Praxis leider schon. Das hat vor allem mit den von Meep Meep bereits angesprochenen temporären Objekten zu tun, die Compiler nicht vollständig eliminieren können. Dort gab es immer mal wieder diverse Lösungsansätze. Alexandrescu hat auch mal etwas dazu verfasst, Stichwort Mojo. Ein bekannte Lösung für binäre Operatoren sind Expression Templates. Allerdings ist sowas weder elegant zu implementieren, noch einfach zu warten. Jedenfalls kann das ziemlich komplexe Ausmasze annehmen.</p>
<p>Sry wenn dich einige hier anmachen, aber deine Frage ist durchaus berechtigt.</p>
</blockquote>
<p>Ist sie finde ich nicht. (Ich vor allem habe mich auch am Ton des OP mehr gestossen als an seiner Frage. Etwas nicht zu wissen und zu fragen ist OK, auf richtige Antworten dann aber patzig zu werden ... vertrage ich nicht ganz.)</p>
<p>Ein überladener Operator ++ ist nicht langsamer als eine &quot;increment&quot; Memberfunktion.<br />
Ein überladener Operator += ist auch nicht langsamer als eine &quot;add&quot; Memberfunktion.<br />
Beides sind üblicherweise Memberfunktionen und werden ganz genau gleich aufgerufen.</p>
<p>D.h. solange man nicht anfängt Äpfel mit Birnen zu vergleichen...</p>
<p>Ein Aufruf von Operator + der ein Temporary zurückliefert + ein Aufruf von Operator = mit diesem Temporary als Argument, dann vielleicht noch darauf besteht dass Operator = eine Referenz auf *this zurückliefert ... wenn du das mit dem Aufruf einer einzigen Funktion die void zurückliefert vergleichen willst ... ich finde den Vergleich auf jeden Fall unsinnig.</p>
<p>----</p>
<p>Wo ich dir natürlich zustimme: mit überladenen Operatoren kann man schwerer optimieren als mit Memberfunktionen. Was aber einfach daran liegt dass Operatoren eine vorgegebene Anzahl an Parametern haben, und Memberfunktionen nicht. Wo wir dann auch wieder bei den Äpfeln und Birnen wären, man soll eben keinen Apfel den Job einer Birne machen lassen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1329542</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1329542</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 20 Jul 2007 22:30:45 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren langsam, wie so...? on Sat, 21 Jul 2007 09:05:24 GMT]]></title><description><![CDATA[<p>Es geht in diesem Thread um Optimierungstechniken von Funktionen und Operatoren (auch mit SSE, MMX etc.) Ich habe behauptet, dass man Operatoren nur schwer optimieren kann und dass sie deshalb langsam sind.<br />
Der Code war nur ein Beispiel für eine Optimierungstechnik. (meine Meinung nach eine schöne UND aufwendige Technik)<br />
Ich habe genervt beantwortet, weil die Optimierungstechnik, die da benutzt wird, ignoriert wurde. Man muss ja nicht unbediengt die ganze Implementierung sehen, um zu wissen was die Klasse macht.</p>
<p>Jetzt habe ich noch eine Frage an die jenigen die Sachlich diskutieren können und mir bei meinem Problem helfen wollen:</p>
<p>Was genau ist der Unterschied zwischen Inline-Assembler-Code und Verwendung von Intrinsics.<br />
Inline-Assembler, wird ja immer noch benutzt, obwohl es mit Intrinsics einfacher geht.</p>
<p>PS: Ich werde jetzt dafür kein Beispielcode verwerden, ihr wisst schon warum...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1329623</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1329623</guid><dc:creator><![CDATA[orkun]]></dc:creator><pubDate>Sat, 21 Jul 2007 09:05:24 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren langsam, wie so...? on Sat, 21 Jul 2007 09:41:35 GMT]]></title><description><![CDATA[<p>wenn du inline assembler verwendest hast du die komplette kontrolle ueber den generierten code, aber auch die komplette verantwortung dafuer.<br />
meines wissens kann der kompiler jedoch selbst keine optimierungen mehr an dem code vornehmen.</p>
<p>intrinsics erscheinen wie normale funktionen, werden jedch direkt in maschinencode umgesetzt.</p>
<p>ob der kompiler damit noch optimieren kann entzieht sich meinem wissen.<br />
hab auch irgendwo im internet mal gelesen, das mit VC auf nem 64-bit windows kein inline assembler mehr moeglich sein soll. kann jetzt aber die quelle dazu nicht angeben. schon zu lange her. also mit vorsicht zu geniesen.</p>
<p>Meep Meep</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1329642</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1329642</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Sat, 21 Jul 2007 09:41:35 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren langsam, wie so...? on Sat, 21 Jul 2007 09:46:27 GMT]]></title><description><![CDATA[<p>orkun schrieb:</p>
<blockquote>
<p>Es geht in diesem Thread um Optimierungstechniken von Funktionen und Operatoren (auch mit SSE, MMX etc.) Ich habe behauptet, dass man Operatoren nur schwer optimieren kann und dass sie deshalb langsam sind.</p>
</blockquote>
<p>sah fuer mich nicht so aus</p>
<p>orkun schrieb:</p>
<blockquote>
<p>Warum sind eigentlich operatoren langsamer als &quot;normale&quot; funktionen...?</p>
</blockquote>
<p>orkun schrieb:</p>
<blockquote>
<p>Man muss ja nicht unbediengt die ganze Implementierung sehen, um zu wissen was die Klasse macht.</p>
</blockquote>
<p>haette die sache aber unter umstaenden vereinfacht</p>
<p>Meep Meep</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1329646</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1329646</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Sat, 21 Jul 2007 09:46:27 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren langsam, wie so...? on Sat, 21 Jul 2007 14:52:49 GMT]]></title><description><![CDATA[<p>orkun schrieb:</p>
<blockquote>
<p>...Ich habe behauptet, dass man Operatoren nur schwer optimieren kann und dass sie deshalb langsam sind....</p>
</blockquote>
<p>Ist trotzdem Quatsch !<br />
Was Du vielleicht meinst, ist, dass bestimmte Aufrufsemantiken weniger Optimierungstechniken zulassen als andere. Ob diese in f() oder in operator_() umgesetzt wird, spielt keine Rolle.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1329824</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1329824</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Sat, 21 Jul 2007 14:52:49 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren langsam, wie so...? on Sat, 21 Jul 2007 15:42:13 GMT]]></title><description><![CDATA[<p>orkun schrieb:</p>
<blockquote>
<p>Es geht in diesem Thread um Optimierungstechniken von Funktionen und Operatoren (auch mit SSE, MMX etc.) Ich habe behauptet, dass man Operatoren nur schwer optimieren kann und dass sie deshalb langsam sind.</p>
</blockquote>
<p>Nein, hast du nicht.</p>
<p>du hast neben dem von Meep meep zitiertem teil auch folgendes geschrieben:</p>
<blockquote>
<p>Warum wird in Real Time Rendering oder Physik Engines auf operatoren verzichtet...?</p>
<p>Beispielsweise Havok Vectorklasse sieht so aus:</p>
</blockquote>
<p>und pastest danach einen code, der ganz offensichtlich auf operatoren aufbaut, nur dass er sie intelligent nutzt, und nachdem wir den code mühevoll aufdröseln, wirst du patzig und behauptest &quot;Das hab ich doch alles schon gewusst&quot;.</p>
<p>&lt;°(((&gt;&lt;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1329852</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1329852</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sat, 21 Jul 2007 15:42:13 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren langsam, wie so...? on Sat, 21 Jul 2007 19:00:19 GMT]]></title><description><![CDATA[<p>Oh man, ohne deine Hilfe hätte ich eine Woche lang auf die Implementierung der Methoden gestart und nicht gewusst was die Klasse macht, danke dass du mir alles erklärt hast...</p>
<p>Jetzt mal im Ernst:<br />
Okay, ich bin Student und lebe seit einpaar Jahren in Deutschland. Ich habe meine Frage sehr schlecht formulieren(auch überschrift schlecht formuliert). Ich wollte eigentlich mehr über Optimierungstechniken wissen ...und worum geht's denn jetzt in diesem Thread...???<br />
Naja egal... Nachdem mehrmals geschrieben wurde, dass ein Operator auch eine Funktion ist, habe ich geschrieben, dass in 3D engines auf operatoren verzichtet wird, deshalb die Behauptung, dass Operatoren langsam sind. Ich habe versucht, auf die schwerige(!) Optimierung von Operatoren aufmerksam zu machen. Ich dachte Headerdatei reicht, weil da auch die expression structs und die arithmetic operationen deklariert sind. Es war ein Beispiel...</p>
<p>...und ich behaupte nicht, dass ich Ahnung habe... im Gegenteil, ich habe Frage gestellt, weil ich mehr wissen möchte. Mit Sachliche Diskusion meine ich, dass man über das Thema diskutiert und nicht über meine genervte Ton, über meine Sprachkenntnisse etc...</p>
<p>Kurz:<br />
Es ging in diesem Thread um Optimierungstechniken, um eine Vectorklasse mit optimierte Operationen, wie man am besten arithmetic operationen optimieren kann... Sollte man vielleicht doch operatoren benutzten. Oder lieber so was machen:</p>
<p><a href="http://www.cortstratton.org/articles/OptimizingForSSE.php" rel="nofollow">http://www.cortstratton.org/articles/OptimizingForSSE.php</a></p>
<p>So missverständlich war der Anfangspost nun wieder auch nicht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1329942</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1329942</guid><dc:creator><![CDATA[orkun]]></dc:creator><pubDate>Sat, 21 Jul 2007 19:00:19 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren langsam, wie so...? on Sat, 21 Jul 2007 22:59:34 GMT]]></title><description><![CDATA[<p>orkun schrieb:</p>
<blockquote>
<p>Oh man, ohne deine Hilfe hätte ich eine Woche lang auf die Implementierung der Methoden gestart und nicht gewusst<br />
was die Klasse macht, danke dass du mir alles erklärt hast...</p>
</blockquote>
<p>solche saetze werden dich auch nicht weiter bringen.</p>
<p>nun zurueck zur thematik.</p>
<p>orkun schrieb:</p>
<blockquote>
<p>Kurz:<br />
Es ging in diesem Thread um Optimierungstechniken, um eine Vectorklasse mit optimierte Operationen,<br />
wie man am besten arithmetic operationen optimieren kann... Sollte man vielleicht doch operatoren benutzten.</p>
</blockquote>
<p>schreib einfach mal deine verctorklasse oder was auch immer.<br />
messe danach die lauftzeit und benutze einen profiler deines vertrauens.<br />
danach, wenn du weißt an welchen stellen optimiert werden muss,<br />
postest du den code und wir koennen uns das dann mal ansehen und darueber<br />
diskutieren was man machen kann.<br />
einfach pauschal sagen, so und so musst es machen und dann ist es schnell,<br />
wird wahrscheinlich nicht funktionieren.<br />
da ist die ganze sache von zu vielen faktoren abhaengig.</p>
<p>Meep Meep</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1330032</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1330032</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Sat, 21 Jul 2007 22:59:34 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren langsam, wie so...? on Sun, 22 Jul 2007 02:24:46 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/15524">@orkun</a>:<br />
Ohne auf die anderen Dinge einzugene etwas zu deiner Frage... was ist der Unterschied zwischen intrinsics und inline Assembler...</p>
<p>Der Unterschied ist: mit inline Assembler kommt genau der Code raus den du schreibst, Befehl für Befehl. Dadurch hast du z.B. auch die Kontrolle darüber was zu welchem Zeitpunkt in einem Register gehalten wird, wann du etwas auf den Stack pusht etc.</p>
<p>Bei intrinsics ist zwar sichergestellt dass für die eigentliche Funktion der gewünschte Assembler Befehl verwendet wird, und dass es keinen Funktionsaufruf gibt, allerdings kannst du nicht kontrollieren wie die Parameter genau geladen werden, ob sie bis zum nächsten Aufruf in einem Register stehen bleiben oder neu geladen werden etc. Was das angeht bist du auf den Optimizer vom Compiler angewiesen. Wenn der gut arbeitet ist das nicht schlimm, aber manchmal baut der weniger optimalen Code zusammen als man selbst schreiben könnte.</p>
<p>Der Vorteil von intrinsics ist also dass einem der Compiler/Optimizer viel Arbeit abnehmen kann, man sich also um Register Allocation etc. keine Gedanken machen braucht. Eint weiterer Vorteil ist natürlich dass jeder C++ Programmierer den Code noch lesen kann, vorausgesetzt er hat Zugriff auf die Dokumentation der verwendeten intrinsics.<br />
Meist ist der resultierende Code auch schnell genug, oft genug sogar schneller als wenn man inline Assembler schreibt.</p>
<p>Was Optimierungen im Allgemeinen angeht... das ist ein riesen Thmea. Gewisse Dinge sind noch relativ einfach, und man kann einfach darauf achten keinen Blödsinn zu bauen. z.B. dass Dinge wie Winkelfunktionen, Wurzeln, Logarithmen etc. extrem langsam sind. Früher was auch noch ein enormer Unterschied zwischen floating point und integer, ist heutzutage aber nichtmehr so schlimm. Eine andere Sache die manchmal etwas bringt: mehrere unabhängige Sachen parallel zu machen ist oft besser optimierbar als wenn man sie hintereinander macht. Beispiel:</p>
<pre><code class="language-cpp">struct sepp { int x; int y };

void foo(sepp* p, unsigned size)
{
    for (unsigned i = 1; i &lt; size; i++)
        p[i].x = p[i].x * 3 / 6 + p[i-1].y;

    for (unsigned i = 1; i &lt; size; i++)
        p[i].y = p[i].y * 5 / 7 + p[i-1].x;
}

void bar(sepp* p, unsigned size)
{
    for (unsigned i = 0; i &lt; size; i++)
    {
        p[i].x = p[i].x * 3 / 6 + p[i-1].y;
        p[i].y = p[i].y * 5 / 7 + p[i-1].x;
    }
}
</code></pre>
<p>Angenommen der Optimizer kann nicht erkennen dass er die beiden Schleifen in foo zusammenziehen kann, dann wird der Code in bar deutlich schneller sein. Nicht unbedingt wegen des Overheads der Schleife, sondern eher deswegen weil in bar 2 unabhängige Rechnungen &quot;parallel&quot; passieren...<br />
In foo muss der Compiler quasi folgenden Code in der Schleife generieren:</p>
<pre><code>0    load reg_1, p[i].x
1    mul reg_1, 3
2    div reg_1, 6
3    add reg_1, p[i-1].y
4    store reg_1, p[i].x
</code></pre>
<p>Hier muss Befehl 1 darauf warten dass Befehl 0 fertig ist, Befehl 2 darauf dass Befehl 1 fertig ist etc. Das bremst die CPU aus.<br />
In bar kann der Compiler schon Code generieren der &quot;interleaved&quot; ist, und selbst wenn der Compiler dazu zu dumm ist kann die CPU es meist selbst &quot;reordern&quot; (Im ersten Fall kann die CPU selbst nichts reordern, da sie durch die Schleife daran gehindert wird).<br />
Sieht dann etwa so aus:</p>
<pre><code>0    load reg_1, p[i].x
1    load reg_2, p[i].y
2    mul reg_1, 3
3    mul reg_2, 5
4    div reg_1, 6
5    div reg_2, 7
6    add reg_1, p[i-1].y
7    add reg_2, p[i-1].y
8    store reg_1, p[i].x
9    store reg_2, p[i].y
</code></pre>
<p>Befehl 1 ist nun von Befehl 0 unabhängig und muss nicht warten. Befehl 2 ist nur von Befehl 0 abhängig - da dazwischen aber schon Befehl 1 ausgeführt wurde ist die Wartezeit zumindest verkürzt, dasselbe gilt für alle weiteren Befehle.<br />
Das Beispiel ist grob vereinfacht, genauso wie der &quot;pseudo-Assembler&quot; den ich hier verwendet habe, aber ich hoffe du verstehst worum es geht.</p>
<p>Je schneller man also das Ergebnis einer Operation als Quelle/Parameter/Argument für einen neue Operation verwendet, und je weniger &quot;unabhngiger&quot; Code drumherum zu finden ist, desto schlechter ist das. Besonders schlimm ist das bei Operationen wie Dividieren und Multiplizieren. Eine Division gleich gefolgt von einem Befehl der das Ergebnis dieser Division verwendet kann die Ausführung für etliche Zyklen anhalten, weil Divisionen nunmal sehr lange dauern. Macht man nach der Division dagegen erstmal mit anderen Dingen weiter kann diese sozusagen &quot;im Hintergrund&quot; weiterlaufen, und wenn dann etliche Takte später das Ergebnis verwendet wird ist es u.U. schon fertig.</p>
<p>----</p>
<p>Was allerdings auch klar sein sollte: Optimieren ist der grösste Feind der Übersichtlichkeit, Einfachkeit und Wartbarkeit eines Programmes. Optimieren sollte man daher immer nur dort wo es nötig ist bzw. wo es wirklich Sinn macht. Wo es nötig ist bzw. Sinn macht findet man am besten mit einem Profiler heraus. Und das auch nur nachdem man festgestellt hat dass das Programm &quot;zu langsam&quot; ist - wenn das Programm so wie man es ohne Optimierungen geschrieben hat schnell genug ist sollte man einfach glücklich darüber sein und garnixmehr angreifen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1330047</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1330047</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 22 Jul 2007 02:24:46 GMT</pubDate></item></channel></rss>