<?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[Warum ist C++ hier langsamer?]]></title><description><![CDATA[<p>Hallo,</p>
<p>folgendes Szenario:<br />
ich habe mir 2 rudimentäre Log-Klassen implementiert. Einmal in C++ und einmal in PHP. Grund: reine Neugier bzgl. der Geschwindigkeit.</p>
<p>Die C++ Datei:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;fstream&gt;

#include &lt;time.h&gt;

class Logger {
public:
	Logger(std::string log_file) {
		this-&gt;log_file = log_file;
	}

	void write(const std::string &amp;message) const {
		std::ofstream log_file_stream;
		log_file_stream.open(this-&gt;log_file, std::ios_base::app);
		log_file_stream &lt;&lt; message &lt;&lt; &quot;\n&quot;;
		log_file_stream.close();
	}
private:
	std::string log_file;
};

int main(int argc, char* argv[]) {
	if(argc &gt; 1) {
		clock_t tStart = clock();

		Logger logger(&quot;./log-cpp.txt&quot;);

		std::string log_message;
		for(int i = 1; i &lt; argc; i++) {
			log_message += (std::string) + argv[i] + (i != (argc - 1) ? &quot; &quot; : &quot;&quot;);
		}

		for(int i = 0; i &lt;= 100; i++)
			logger.write(log_message);

		printf(&quot;Time taken: %.2fs\n&quot;, (double)(clock() - tStart)/CLOCKS_PER_SEC);

		return 0;
	} else {
		// ERROR...

		return 1;
	}
}
</code></pre>
<p>Anmerkung: ich programmiere C++ nur hin und wieder, wenn das ganze nicht so wirklich schön implementiert ist - steinigt mich nicht.<br />
Jedenfalls: Ausführungszeit beträgt zwischen 0.1 bis 0.15 Sekunden.</p>
<p>Die PHP Variante:</p>
<pre><code>&lt;?php
class Log {
    const LOG_FILE = './log-php.txt';

    public static function write($message)
    {
        file_put_contents(self::LOG_FILE, $message . &quot;\r\n&quot;, FILE_APPEND | LOCK_EX);
    }
}

$start = microtime();
$start = explode(' ', $start);
$start = ($start[1] + $start[0]);
define('SCR_START', $start);

for($i = 0; $i &lt;= 100; $i++) {
    Log::write($i . ': This is a test');
    //exec('log.exe '.$i.': This is test');
}

$end = microtime();
$end = explode(' ', $end);
$end = ($end[1] + $end[0]);
define('SCR_END', $end);

echo '&lt;br&gt;&lt;br&gt; Execution: ' . (SCR_END - SCR_START) . 's';
</code></pre>
<p>Ausführungszeit: 0.012 bis 0.02 Sekunden.</p>
<p>Wie man sieht hab ich auch die C++ Implementation über PHP aufgerufen - da warens dann direkt mal 6 Sekunden, weil der Interpreter vermutlich beim Aufrufen von &quot;exec&quot; bissl mehr zu tun hat wie erwartet.</p>
<p>Die Frage aber bleibt: warum ist die PHP Implementation schneller? Liegts einfach nur an meinem Quellcode oder woran sonst?</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/319515/warum-ist-c-hier-langsamer</link><generator>RSS for Node</generator><lastBuildDate>Sat, 25 Jul 2026 07:59:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/319515.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 21 Aug 2013 18:22:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Warum ist C++ hier langsamer? on Wed, 21 Aug 2013 18:22:54 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>folgendes Szenario:<br />
ich habe mir 2 rudimentäre Log-Klassen implementiert. Einmal in C++ und einmal in PHP. Grund: reine Neugier bzgl. der Geschwindigkeit.</p>
<p>Die C++ Datei:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;fstream&gt;

#include &lt;time.h&gt;

class Logger {
public:
	Logger(std::string log_file) {
		this-&gt;log_file = log_file;
	}

	void write(const std::string &amp;message) const {
		std::ofstream log_file_stream;
		log_file_stream.open(this-&gt;log_file, std::ios_base::app);
		log_file_stream &lt;&lt; message &lt;&lt; &quot;\n&quot;;
		log_file_stream.close();
	}
private:
	std::string log_file;
};

int main(int argc, char* argv[]) {
	if(argc &gt; 1) {
		clock_t tStart = clock();

		Logger logger(&quot;./log-cpp.txt&quot;);

		std::string log_message;
		for(int i = 1; i &lt; argc; i++) {
			log_message += (std::string) + argv[i] + (i != (argc - 1) ? &quot; &quot; : &quot;&quot;);
		}

		for(int i = 0; i &lt;= 100; i++)
			logger.write(log_message);

		printf(&quot;Time taken: %.2fs\n&quot;, (double)(clock() - tStart)/CLOCKS_PER_SEC);

		return 0;
	} else {
		// ERROR...

		return 1;
	}
}
</code></pre>
<p>Anmerkung: ich programmiere C++ nur hin und wieder, wenn das ganze nicht so wirklich schön implementiert ist - steinigt mich nicht.<br />
Jedenfalls: Ausführungszeit beträgt zwischen 0.1 bis 0.15 Sekunden.</p>
<p>Die PHP Variante:</p>
<pre><code>&lt;?php
class Log {
    const LOG_FILE = './log-php.txt';

    public static function write($message)
    {
        file_put_contents(self::LOG_FILE, $message . &quot;\r\n&quot;, FILE_APPEND | LOCK_EX);
    }
}

$start = microtime();
$start = explode(' ', $start);
$start = ($start[1] + $start[0]);
define('SCR_START', $start);

for($i = 0; $i &lt;= 100; $i++) {
    Log::write($i . ': This is a test');
    //exec('log.exe '.$i.': This is test');
}

$end = microtime();
$end = explode(' ', $end);
$end = ($end[1] + $end[0]);
define('SCR_END', $end);

echo '&lt;br&gt;&lt;br&gt; Execution: ' . (SCR_END - SCR_START) . 's';
</code></pre>
<p>Ausführungszeit: 0.012 bis 0.02 Sekunden.</p>
<p>Wie man sieht hab ich auch die C++ Implementation über PHP aufgerufen - da warens dann direkt mal 6 Sekunden, weil der Interpreter vermutlich beim Aufrufen von &quot;exec&quot; bissl mehr zu tun hat wie erwartet.</p>
<p>Die Frage aber bleibt: warum ist die PHP Implementation schneller? Liegts einfach nur an meinem Quellcode oder woran sonst?</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347604</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347604</guid><dc:creator><![CDATA[Lokart]]></dc:creator><pubDate>Wed, 21 Aug 2013 18:22:54 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist C++ hier langsamer? on Wed, 21 Aug 2013 18:45:40 GMT]]></title><description><![CDATA[<p>Du machst ja in C++ die Datei bei jedem Schreiben auf und wieder zu <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> . Ist doch klar, dass das saulangsam ist.</p>
<p>Deshalb hält man Dateien auch nicht als std::string (wie kommt man auf die Idee?), sondern als ihre übliche C++-Abstraktion: (i/o)fstream. Oder man entzieht der Klasse ganz die Verantwortung für die Datei und benutzt nur noch einen allgemeinen (i/o)stream. Überhaupt ist ein explizites open oder close in C++ sehr oft ein Designfehler - eine Datei sollte so lange offen bleiben, wie ihr assoziierter Stream lebt.</p>
<p>Du misst hier in allererster Linie die Implementation von open und close aus der jeweiligen Standardbibliothek, dein Programm selber leistet jeweils so gut wie keine Arbeit, daher merkst du keinen Effekt der Sprache.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347607</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347607</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 21 Aug 2013 18:45:40 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist C++ hier langsamer? on Wed, 21 Aug 2013 18:52:38 GMT]]></title><description><![CDATA[<p>Grund für das &quot;Auf und Zumachen&quot; ist eben, weil ich das Programm ursprünglich über PHP ausgeführt habe (und hier wird das Programm 100 mal hintereinander ausgeführt).</p>
<p>Das bzgl. std::string ist mein Fehler - wusste ich nicht besser.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347611</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347611</guid><dc:creator><![CDATA[Lokart]]></dc:creator><pubDate>Wed, 21 Aug 2013 18:52:38 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist C++ hier langsamer? on Wed, 21 Aug 2013 18:52:58 GMT]]></title><description><![CDATA[<p>Ich kenn mich mit PHP nicht aus. Aber es scheint so, als legst du in PHP nur 1x einen Stream an, in C++ legst du aber 101x einen Stream an. Wenn ich das Ganze mal verbessere braucht dein Quellcode mit argc=2 3ms bei mir.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347612</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347612</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Wed, 21 Aug 2013 18:52:58 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist C++ hier langsamer? on Wed, 21 Aug 2013 21:43:06 GMT]]></title><description><![CDATA[<p>file_put_contents macht das File auch jedes mal auf, schreibt dann, und machts dann wieder zu.<br />
<a href="http://php.net/manual/en/function.file-put-contents.php" rel="nofollow">http://php.net/manual/en/function.file-put-contents.php</a></p>
<p>Aber ersetz einfach mal std::ios_base::app durch std::ios_base::ate.<br />
Das sollte mMn. einiges bringen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347653</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347653</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 21 Aug 2013 21:43:06 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist C++ hier langsamer? on Thu, 22 Aug 2013 07:02:09 GMT]]></title><description><![CDATA[<p>Das sieht auch sehr lustig aus:</p>
<pre><code class="language-cpp">log_message += (std::string) + argv[i] + (i != (argc - 1) ? &quot; &quot; : &quot;&quot;);
</code></pre>
<p>Sieht aus, als sei</p>
<pre><code class="language-cpp">log_message += std::string() + argv[i] + (i != (argc - 1) ? &quot; &quot; : &quot;&quot;);
</code></pre>
<p>gemeint, aber in Wirklichkeit ist der erste Term ein unäres Plus, angewandt auf <code>argv[i]</code> , was dann nach std::string gecastet wird. Dabei ist das gar nicht so schlecht, nur sollte man es dann auch so schreiben (ohne das + natürlich):</p>
<pre><code class="language-cpp">log_message += std::string(argv[i]) + (i != (argc - 1) ? &quot; &quot; : &quot;&quot;);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2347677</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347677</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Thu, 22 Aug 2013 07:02:09 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist C++ hier langsamer? on Thu, 22 Aug 2013 13:23:08 GMT]]></title><description><![CDATA[<p>Wie gesagt, ich programmiere C++ nur hin und wieder <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="😉"
    /></p>
<p>Zu dem Tipp bzgl. <code>std::ios_base::ate</code> - sehr interessant, direkt auf 0.02 bis 0.04 Sekunden runter. Danke.</p>
<p>Mein eigentliches Ziel aber habe ich nicht erreicht. Es liegt nicht an der Geschwindigkeit des C++-Programms, sondern an &quot;exec&quot; selbst. Ich wollte versuchen, den Logger über ein nativ geschriebenes Programm auszuführen um so mehr Geschwindigkeit rauszuholen - das exec so langsam ist, wusste ich nicht.</p>
<p>Scheinbar ist die von beispielsweise Facebook genutzte Lösung, Scribe, dann wohl die einzig schnellere um das Logging schneller hinzukriegen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347835</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347835</guid><dc:creator><![CDATA[Lokart]]></dc:creator><pubDate>Thu, 22 Aug 2013 13:23:08 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist C++ hier langsamer? on Thu, 22 Aug 2013 13:25:17 GMT]]></title><description><![CDATA[<p>Der Doppelpost sei entschuldigt, aber mir fiel gerade auf: keine Ahnung wo das Plus herkommt, in meinem Programm siehts eigentlich so aus:</p>
<pre><code>log_message += (std::string)argv[i] + (i != (argc - 1) ? &quot; &quot; : &quot;&quot;);
</code></pre>
<p>Vermutlich das Überbleibsel von irgendwelchen Tests die ich gestern noch angestellt hatte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347836</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347836</guid><dc:creator><![CDATA[Lokart]]></dc:creator><pubDate>Thu, 22 Aug 2013 13:25:17 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist C++ hier langsamer? on Thu, 22 Aug 2013 13:37:31 GMT]]></title><description><![CDATA[<p>Compilierte Sprachen machen Dateioperationen, Internetverbindungen, usw. nicht magisch schneller. Compilierte Sprachen können schnell rechnen. Man schreibt kein C++-Programm, damit dies schneller in Dateien schreibt. Das Schreiben in die Datei ist es, was die Geschwindigkeit bestimmt, egal welche Sprache. Du bekommst eben höchstens noch Overhead durch die zusätzliche Programmdatei, die hier komplett starten und beenden muss. Ich kenne php nicht, aber wenn ich das Handbuch richtig verstehe startet exec sogar eine ganze Subshell, was dann wirklich mörderisch für die Geschwindigkeit wäre. Was du ja auch misst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347842</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347842</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 22 Aug 2013 13:37:31 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist C++ hier langsamer? on Fri, 23 Aug 2013 02:46:04 GMT]]></title><description><![CDATA[<p>Lokart schrieb:</p>
<blockquote>
<p>Scheinbar ist die von beispielsweise Facebook genutzte Lösung, Scribe, dann wohl die einzig schnellere um das Logging schneller hinzukriegen.</p>
</blockquote>
<p>Nein, GANZ sicher nicht die einzige.<br />
Du kannst in C++ Extensions für PHP entwickeln. Also quasi Funktionen in C++ implementieren die du aus PHP dann direkt aufrufen kannst -- genau so als wenn es &quot;echte&quot; PHP Funktionen wären.</p>
<p>Diese können dann beliebig schlaues Caching/Coalescing machen, und dadurch die Logging-Geschwindigkeit quasi beliebig steigern.</p>
<p>Du kannst aber auch, was viel einfacher wäre, deinen eigenen Logging-Funktionen in PHP so schreiben, dass sie einfach nicht das File dauernd auf- und wieder zumachen. Damit wirst du langsamer sein als mit einer &quot;schlauen&quot; C++ Extension, aber immer noch viel schneller als jetzt.</p>
<p>Oder du verwendest einen Logging-Daemon, der über Sockets oder Pipes Verbindungen annimmt, und alles was auf diesen Verbindungen ankommt in das Logfile schreibt. Der Logging-Daemon wäre dann wieder in etwas anderem als PHP implementiert, damit er asynchrone IO Funktionen, Threads und was nicht noch alles verwenden kann um das Schreiben von vielen kleinen Datenstückchen in ein gemeinsames Logfile zu beschleunigen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347965</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347965</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 23 Aug 2013 02:46:04 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist C++ hier langsamer? on Fri, 23 Aug 2013 09:52:08 GMT]]></title><description><![CDATA[<p>&quot;Einzige&quot; war wohl das falsche Wort, stimmt.</p>
<blockquote>
<p>Du kannst in C++ Extensions für PHP entwickeln. Also quasi Funktionen in C++ implementieren die du aus PHP dann direkt aufrufen kannst -- genau so als wenn es &quot;echte&quot; PHP Funktionen wären.</p>
<p>Diese können dann beliebig schlaues Caching/Coalescing machen, und dadurch die Logging-Geschwindigkeit quasi beliebig steigern.</p>
</blockquote>
<p>&quot;Beliebig&quot;? Ich weiß nicht, wie die entsprechenden Funktionen in PHP momentan in implementiert sind - vlt. sind diese ja schon relativ gut optimiert? Keine Ahnung.</p>
<blockquote>
<p>Du kannst aber auch, was viel einfacher wäre, deinen eigenen Logging-Funktionen in PHP so schreiben, dass sie einfach nicht das File dauernd auf- und wieder zumachen. Damit wirst du langsamer sein als mit einer &quot;schlauen&quot; C++ Extension, aber immer noch viel schneller als jetzt.</p>
</blockquote>
<p>Was i.d.R. nicht unter realen Bedingungen funktioniert. Normalerweise loggt man auf einer Seite ja nicht 100 Sachen auf einmal, sondern nur ein paar Dinge. Ändert man den Request, muss der Interpreter erneut ran und die Datei wieder aufmachen. Wie man den Stream über mehrere Requests offen lassen könnte, wäre mir nicht bekannt (vor allem, da der Interpreter am Ende seiner Arbeit ja alles freigibt und beendet was irgendwie noch da bzw. offen ist).</p>
<blockquote>
<p>Oder du verwendest einen Logging-Daemon, der über Sockets oder Pipes Verbindungen annimmt, und alles was auf diesen Verbindungen ankommt in das Logfile schreibt. Der Logging-Daemon wäre dann wieder in etwas anderem als PHP implementiert, damit er asynchrone IO Funktionen, Threads und was nicht noch alles verwenden kann um das Schreiben von vielen kleinen Datenstückchen in ein gemeinsames Logfile zu beschleunigen.</p>
</blockquote>
<p>Jop, was dann wohl sowas wie Scribe wäre. Wenn ich das richtig verstanden habe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2348042</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2348042</guid><dc:creator><![CDATA[Lokart]]></dc:creator><pubDate>Fri, 23 Aug 2013 09:52:08 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist C++ hier langsamer? on Fri, 23 Aug 2013 10:07:02 GMT]]></title><description><![CDATA[<p>Na ja, es würde ja schon was bringen, wenn der PHP-Logger pro Request nur einmal die Datei öffnen und schreiben würde. Natürlich müsste man dann aufpassen, dass die Datei nicht mehrfach gleichzeitig geöffnet ist. Da könnte man dann halt je nach Kollisionsmöglichkeiten pro Request eine File schreiben und das dann hin und wieder Mal mergen oder so... Nicht so chic, aber klappt php-only halt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2348047</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2348047</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Fri, 23 Aug 2013 10:07:02 GMT</pubDate></item></channel></rss>