PB schneller als C++

Fragen zu allen anderen Programmiersprachen.
Nik
Beiträge: 132
Registriert: 04.02.2005 19:57

PB schneller als C++

Beitrag von Nik »

Also da hört man immer C++ sei sooo schnell, und PB sei ja eine Anfängersprache und damit überhaupt nicht zu vergleichen...
Da man das genauer wissen will amcht man dann auch nen Test und was sieht man, PB ist wesentlich schnelelr als C++ zumindest was das durchiterieren von listen angeht. Jetz kann man zwar sagen da ich hier erst seit 4 Tagen C++ lerne Code ich was falsch, Ok aber naja zeigt mir ne STL Lösung in C++ die PBs eingebaute Listen schlägt...
Achjah die Größenverhältnisse sehen auch sehr gut für Pb aus 7,50 KB zu 465 KB. (bei unserem Compiler auf der Optimierstufe 3 (G++)).
Achja kann mir jemand sagen wie man Str() in C++ macht???(mit den STL Strings)

C++

Code: Alles auswählen

#include <list>
#include <iostream>
#include <time.h>
#include <string>

using namespace std;

struct MyStruct{
      char myByte;
      long int myLong;
      short int myWord;
      string myString;
      }; 
typedef list<MyStruct>::iterator LI;

int main(int argc, char *argv[])
{
    int Start=clock();
    list<MyStruct> myList;
    MyStruct naechster;
    for(int i=1;i<=999999;i++){
    naechster.myString="Test";
    myList.push_back(naechster);  
    };    
    naechster.myString="Test!";
    myList.push_back(naechster);
    
    
    for(LI i=myList.begin();i!=myList.end();++i){
       if((*i).myString=="Test!"){
       cout << clock()-Start<< " Millisekunden";
       cin >>Start;
       };
       };
    return EXIT_SUCCESS;    
    
}

PureBasic

Code: Alles auswählen

Start=ElapsedMilliseconds()
Structure Teest
  String.s
  Byte.b
  Long.l
  Word.w
EndStructure

NewList List.Teest()

OpenConsole()

For i = 1 To 999999
   AddElement(List())
   List()\String="Test"
Next
 AddElement(List())
 List()\String="Test!"


ForEach List()
  If List()\STRing="Test!"
    Print(Str(ElapsedMilliseconds()-Start)+" Millisekunden")
    Input()
  EndIf
Next
PS: Frohes neus Jahr.
www.KoMaNi.de
Eine kleine Gruppe von Hobby Programmierern, die gerade einen Instant Messenger natürlich in PureBasic schreiben.
Benutzeravatar
Eric
Beiträge: 303
Registriert: 05.09.2004 09:50
Wohnort: Göttingen

Beitrag von Eric »

Bei C++ wird gleich die komplette Laufzeitbibliothek dazugelinkt,
aber bei PB nur die verwendeten Befehle.

Mal ein Vergleich:
Ich habe heute ein kleines textbasirendes Tool mit c++ geschrieben.
Als exe ist das gut 470KB groß
als statische Bibliothek nur etwa 3KB :shock: .
Ich überlege, ob ich nicht die Funktionen als Lib zusammenfasse
und GUI und so mit PB schreibe.
El_Choni_work: cant't you just spit the binary data to sqlite, as you would spit a hamster into a microwave oven?
* Fangles falls off the chair laughing
Bild
Nik
Beiträge: 132
Registriert: 04.02.2005 19:57

Beitrag von Nik »

Also ich bin mir jetzt net so ganz sicher ob Clock() das gleiche /ähnliche wie Elapsedmilliseconds() ist aber auch vom gucken scheint pb schneller zu sein. Wenn dass mal einer überprüfen könnte.
www.KoMaNi.de
Eine kleine Gruppe von Hobby Programmierern, die gerade einen Instant Messenger natürlich in PureBasic schreiben.
MARTIN
Beiträge: 454
Registriert: 08.09.2004 14:03
Wohnort: Kiel

Beitrag von MARTIN »

clock() ist was anderes Elapsedmilliseconds().
clock() zeigt wie viel Prozessorzeit das Programm verbraucht hat, das lässt nur indirekt darauf schliessen wie lang das Programm gelaufen ist.
Für deine vergleiche ist diese Funktion ungeeignet.
Und time.h für C++ heisst eigentlich ctime.

Das habe ich vorher überlesen.
Str() in C++ macht???(mit den STL Strings)
so:

Code: Alles auswählen

int zahl = atoi(string.c_str());
Zuletzt geändert von MARTIN am 01.01.2006 05:33, insgesamt 1-mal geändert.
Amilo 1667|Suse Linux 10.1_64bit/WinXP |PB 4.00/3.94
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

Ich hab das C++ Programm mal in sofern modifiziert, dass man WinAPI-Funktionen nutzen kann. Das Ergebnis sieht dann bei mir so aus, dass man ~ 600 ms für das C++ Programm benötigt. Das PB Programm benötigt bei mir ebenso um die 600 ms. Nimmt sich beides nicht viel.

Wenn man aber mal die Schleife um eine 9 erweitert, dann dauert die PB-Liste bei mir ~29000 ms. Die C++ Schleife hingegen "nur" 24000 ms.
Benutzeravatar
Spirit
Beiträge: 174
Registriert: 13.04.2005 19:09

Beitrag von Spirit »

MARTIN hat geschrieben:
Str() in C++ macht???(mit den STL Strings)
so:

Code: Alles auswählen

int zahl = atoi(string.c_str());
Str() wandelt aber eine Zahl in einen String um, und nicht umgekehrt.
Das, was du da geschrieben hast, wäre in PB der Val() Befehl.
Ich habe mir dafür ( Str() ) selbst eine Funktion geschrieben:

Code: Alles auswählen

std::string int_to_str(int num)
{
	std::string n_str;
	bool negative = false;
	int r;

	if (num == 0)
		return "0";
	else if (num < 0)
	{
		negative = true;
		num      = -num;
	}

	while (num != 0)
	{
		r     = num % 10;
		n_str = (char)(r + '0') + n_str;
		num   = (num - r) / 10;
	}

	if (negative)
		n_str = '-' + n_str;

	return n_str;
}
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

oh man, wenn man keine ahnung hat...

also die template variante, die für generics ist, was eine sehr komplexe sache ist ist unter umständen langsamer als die nichtgenerische purebasic variante. das ist ja eine unglaubliche erkenntnis. pass auf, da hab ich eine genausogute: aus einem wolkenkratzer zu springen mit einem aufgeblasenem luftballon zwischen den lippen ist viel sicherer als mit 30 km/h einen auffahrunfall zu bauen, denn der luftballon ist viel schneller da als der airbag... und bananen schmecken viel mehr nach pfirsich als äpfel.

wenn du die nichtgenerische purebasic liste vergleichen willst mit einem c++ äquivalent, dann mußt du dir schon selbst eine linked list schreiben, denn die generische version ist was ziemlich anderes, aber dahinter wirst du kommen wenn du dich mehr mit generics beschäftigt hast.

wenn ihr irgendwas zu kompilierten dateigrößen schreibt, dann müßt ihr schon den verwendeten kompiler sammt sämtlichen verwendeten einstellungen dazu posten, denn die meisten c/c++ kompiler sind sehr konfigurierbar und es gibt hunderte von c/c++ kompilern, denn das ist eine standardisierte sprache.
die aktuellen compiler von microsoft und intel optimieren selbstständing nach multithreading, wenn man es will, der pb compiler optimiert praktisch überhautpnicht.
Benutzeravatar
AndyX
Beiträge: 1272
Registriert: 17.12.2004 20:10
Wohnort: Niederösterreich
Kontaktdaten:

Beitrag von AndyX »

Ich finde, man sollte nicht andauernd C++ mit PB oder überhaupt Basic vergleichen. Das ist wie mit Äpfel und Birnen...
Nik
Beiträge: 132
Registriert: 04.02.2005 19:57

Beitrag von Nik »

Naja mit den Generics haste ja im Prinzip recht aber wenn amn die Liste in c++ selber coded dann muss man sie auch mit einer in PB Selber gecodeten vergleichen, denn wenn man die STL als Teil von C++ sieht was Herr Straustroup durchaus zu machen scheint, dann ist sie das äquivalent zur PB Linked List wie sie implementiert ist hat dabei nicht zu interessieren.
Nochmal zu der Str sache gibt es da in der STL Stringklasse nix eingebautetes immerhin hat sie ja massig befehle anscheinend nur eben nicht die wirklich sinnvollen. Achja wäre nett wenn ihr den Code mit dem API GetTickCount in c++ mal posten würdet will das ja schließlich gerade lernen (@Zaphod : Ich habe nie gesagt das ich Ahnung habe auch in meinem Post steht das ich mir durchaus beweusst bin das es an mir leigen kann und das ich nicht weiß ob das mit clock so richtig ist ahbe ich auch gesagt, also bitte hör auf so zu spammen jeder fängt mal klein an (ich wäre sehr erstaunt wenn du nach 4 Tagen C++ lernen schon besseres geschrieben hättest...))hab aber noch keinen Schimmer wie ich an die API Befehler komme und ob die alle in Windows.h deklariert sind und so.
www.KoMaNi.de
Eine kleine Gruppe von Hobby Programmierern, die gerade einen Instant Messenger natürlich in PureBasic schreiben.
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

sorry, mich ärgern solche flamewar anzettelungen einfach immer.

nicht jede sprache kommt mit den selben grundfunktionen. die c++ generics sind einfach etwas vollkommen anderes als die linked lists in pb. linked list werden erst seit kurzer zeit überhaupt in sprachen angeboten, früher war es üblich sie selbst umzusetzen. darum ist das unter keinen umständen ein angebrachter vergleich, denn sie sind nicht das c/c++ äquivalent. da die purebasic linked lists aber so umgesetzt sind, wie man sie in c selbst schreiben würde währe es schon am sinnvollsten selbstgeschriebene c linked lists mit den mitgelieferten von pb zu vergleichen. stl muß man da raushalten, bis purebasic etwas ähnliches bietet.

direkt kompiler für verschiedene sprachen zu vergleichen ist sowieso niemals sinnvoll, denn die ausdrucksmöglichkeiten unterscheiden sich. ist eine sprache auf dem ersten blick weniger mächtig als die andere gibt es oft auch andere möglichkeiten die selbe sache auszudrücken.

zu größenvergleichen würde ich mal dezent in richtung 64kb contests aus der demoszene verweisen. das sind in der regel c programme.

ich würde es mir niemals anmaßen nach 4 tagen so einen vergleich von mir zu geben.
Antworten