Aktuelle Zeit: 12.05.2025, 23:56

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 27 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags: Re: Variablen ausgeben
BeitragVerfasst: 16.06.2009, 06:25 
Offline
Benutzeravatar

Registriert: 16.10.2007, 07:56
Beiträge: 229
Wohnort: Regensburg
Ich würde die C-Methode (als alter C-Junkie nutz ich das sowieso die ganze Zeit) bevorzugen. Ich steh halt auf die Formatstrings, da hat man schön viel Kontrolle drüber, wie's aussehen soll.

_________________
Bild


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Variablen ausgeben
BeitragVerfasst: 16.06.2009, 07:26 
Offline
Benutzeravatar

Registriert: 07.08.2008, 11:31
Beiträge: 104
Diese formatierten C-Strings lassen sich zudem beliebig in eine StringTable (MS Windows Applikationen -> Resourcen) oder auch in diverse Sprachpakete einbringen, zB. XML-Sprachdateien. Diese liest man während der Laufzeit ein und verarbeitet sie dementsprechend, bevor sie auf den Bildschirm kommen.

Zumindest unter PHP sind diese Methoden der formatierten Strings unheimlich langsam, wie das bei Anwendungen aussieht weiß ich allerdings nicht genau, da gewissermaßen andere Bedingungen aber auch andere Alternativen vorherrschen.


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Variablen ausgeben
BeitragVerfasst: 16.06.2009, 10:45 
Offline
Benutzeravatar

Registriert: 16.10.2007, 07:56
Beiträge: 229
Wohnort: Regensburg
Na ja, eine gewisse Zeit brauchen die schon ... hab aber bislang noch nicht festgestellt, dass es wirklich langsamer wird (oder schneller, wenn ich's rausnehm). Vielleicht sind die sprintf Varianten auch langsamer, zum Debuggen geb ich die Sachen einfach auf stdout aus.

_________________
Bild


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Variablen ausgeben
BeitragVerfasst: 16.06.2009, 11:18 
Offline
Benutzeravatar

Registriert: 07.08.2008, 11:31
Beiträge: 104
Alles benötigt seine gewisse Zeit, soviel ist sicher. Nur die Frage ist nur, wo sich Zeit eventuell einsparen lässt. Angenommen wir haben eine Schleife. Jeder Durchgang ruft stets die ein und diessele Funktion auf (...) Nun kann es sein, dass bestimmte Verfahren 50 Millisekunden für ihre Durchführung länger benötigen als andere alternative bei gleicher Wirkung (das Gleiche gilt ebenfalls für Algorithmen) . Es ist also eine Frage der Optimierung. Insbesondere bei Spielen (Realtime-Anwendungen) kann sowas durchaus evident sein.

Bei einmaligen Durchläufen sind diese Dinge aber eher zweitrangig. Wichtiger ist dann die Stabilität, Verifizierung von Eingaben, Sicherheit des Systems und so weiter. Bequemlichkeit für den Programmierer nicht zu vergessen.

Ich persönlich benötige diese C-Methoden zumindest für a) Sprachpakete und b) die StringTable(s) (m)einer Windows-Anwendung.


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Variablen ausgeben
BeitragVerfasst: 16.06.2009, 13:27 
Offline

Registriert: 17.11.2007, 11:15
Beiträge: 19
In diesem Fall (Ausgabe von Spielinfos auf den Bildschirm) spielt die Geschwindigkeit auch kaum eine Rolle. Der Vorgang wird doch höchstens ein paar hundert mal pro Sekunde ausgeführt und da ist ein Unterschied von zehntausendstel Sekunden nicht relevant.

Ich habe mal folgenden Test gemacht, um std::stringstream zu prüfen:
Code:
   std::string s = "test";

   {
      u32 t_start = CTime::getTicks(); //Zeit in Millisekunden

      for (u32 i = 0; i < 50000; ++i)
      {
         char buf[256];

         sprintf_s(buf, 256, "%s%d%f", s.c_str(), 123, 0.4f);
      }

      u32 t_end = CTime::getTicks();

      printf("%u ms\n", t_end - t_start);
   }

   {
      u32 t_start = CTime::getTicks();

      for (u32 i = 0; i < 50000; ++i)
      {
         std::stringstream ss;

         ss << s << 123 << 0.4f;
      }

      u32 t_end = CTime::getTicks();

      printf("%u ms\n", t_end - t_start);
   }


Es überrascht kaum, dass die erste Variante (C-Style) etwa 7 mal so schnell ist wie die zweite (mit stringstream).
Debug: 141 zu 1047 ms
Release: 47 zu 350 ms


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Variablen ausgeben
BeitragVerfasst: 16.06.2009, 14:37 
Offline
Benutzeravatar

Registriert: 16.10.2007, 07:56
Beiträge: 229
Wohnort: Regensburg
Mir ist grad noch was eingefallen: ich hab beim Entwickeln der IrrOde Demo-Apps auch ein paarmal (zum Debuggen) ein paar Variablen in jedem Frame auf stdout ausgegeben, und das hat die Sache schon ordentlich gebremst. Wenns ums Debuggen geht, dann muss man die Infos ja nicht (unbedingt) in jedem Frame ausgeben. Ich habs dann so gemacht:

Code:

//Stimmt wohl nicht ganz, sitze gerade in der Arbeit und kann sowas nicht probieren
void meineKlasse::frameUpdate() {
  static int iCnt=0;
  vector3df pos=m_pMeinObject.getAbsolutePosition();
  [... irgendwas mit pos machen ...]
  if (iCnt++>50) {
    printf("--> %.2f, %.2f, %.2f\n",pos.X,pos.Y,pos.Z);
    iCnt=0;
  }
}



So würden die Infos alle 50 Frames ausgegeben, und das hat mir immer geholfen. Das ist allerdings eine Funktionalität, die komplett wieder rausgeflogen ist.

_________________
Bild


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Variablen ausgeben
BeitragVerfasst: 17.06.2009, 13:59 
Offline
Moderator
Benutzeravatar

Registriert: 11.03.2007, 20:25
Beiträge: 556
Wohnort: Frankfurt/Main
@desx:
*ähem*
bitte noch compiler- und maschinen-details dazu!
ich hab nämlich weit undramatischere werte. ich hab als zeitmessung clock() genommen.
windows xp, c::b mingw, d.h. gcc 3.4.5, in einer virtuellen maschine (vmware fusion).
debug und release haben hier keinen unterschied gemacht.
CLOCKS_PER_SEC = 1000

konstruktor und buf-deklaration in der schleife:
snprintf - 78 ticks
stringstream - 141 ticks
.. tatsächlich sehr langsam.

konstr. und dekl. außerhalb der schleife:
snprintf - 78 ticks, bei manchen durchläufen auch 67
sstream - 93 ticks


mac os x, xcode 3.1, gcc 4.2, nativ auf 2.4 ghz c2d
CPS: 1000000

in der schleife:
snprintf - debug: 26740 | release: 26652
sstream - debug: 92519 | release: 89742

außerhalb:
snprintf - debug: 26897 | release: 26712
sstream - debug: 38746 | release: 38345
(hier gibt sich debug oder release auch nichts)

dann ist mir aufgefallen: huh, jetzt hängt der stream ja alles aneinander und wächst unaufhörlich..
snprintf überschreibt ja einfach immer das gleiche array...
wieso eigtl nicht sstream genau das gleiche machen lassen wie snprintf?
dazu wird vor der sstream schleife auch noch ein char buff[255] deklariert und folgendes drin geändert:
Code:
    ss << s << 123 << 0.4f;
    ss.get(&buff[0], 255); // <- extrahiert 255 zeichen aus dem stream und schreibt sie in buff
    ss.str(""); // leeren


snprintf bleibt natürlich gleich, macht ja nix neues, aber..:
sstream - debug: 6919 | release: 6996

das hab ich dann auch unter windows gemacht, aber irgendwie kam immer 16 oder 0 raus.. scheint an der auflösung der clock() implementierung zu liegen. also einfach 10x mehr schleifendurchläufe:
snprintf - debug: 734 | release: 719
sstream - debug: 125 | release: 110

_________________
yo. life's so bloody short.
Ihr dachtet Schulfernsehn sei die ultimative Folter? Falsch: Fahrstuhlmusik, extra leise.


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Variablen ausgeben
BeitragVerfasst: 18.06.2009, 10:02 
Offline

Registriert: 12.04.2007, 11:47
Beiträge: 108
Also ich hab die Tests nu auch mal gemacht und bei mir verliert stringstream immer!!!
Haushoch.
Mingw 5.1.4, gcc 3.4.5, c::b, Windows Vista 32bit

Wenn ich jedoch mal die anzahl auch 500 runtersetzte und printf und std::cout benutze verliert printf aber nur knapp.

Edit: das allerdings nur bei 500 wenn ich 5000 oder 1000 nehme liegt printf wieder vorne


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Variablen ausgeben
BeitragVerfasst: 18.06.2009, 13:02 
Offline
Moderator
Benutzeravatar

Registriert: 11.03.2007, 20:25
Beiträge: 556
Wohnort: Frankfurt/Main
wir brauchen einheitlichen code..
leider sagt mir das forum ständig "das kontingent für anhänge ist bereits ausgenutzt."...
http://migoto.de/main.cpp
Code:
#include <iostream>
#include <sstream>
#include <ctime>
#include <cstdio>

using namespace std;

int main()
{
    clock_t initial = clock();
    cout << "begin test: " << initial << " cps: "<< CLOCKS_PER_SEC <<endl;
   
    stringstream ss;
    char buff[255];
   
    string s = "some test string that needs to be printed to the user";
   
    {      
        clock_t t_start = clock();
        for (int i = 0; i < 50000; ++i)
        {         
         snprintf(&buff[0], 255, "grau: %s blau: %d schwarz: %f", s.c_str(), 123, 0.4f);
        }      
        clock_t t_end = clock();      
        printf("%u ticks\n", t_end - t_start - initial);
    }   
    {
        clock_t t_start = clock();
        for (int i = 0; i < 50000; ++i)
        {                  
            ss << "grau: " << s[0] << "blau: " << 123 << "schwarz: " << 0.4f;
            ss.get(&buff[0], 255);
            ss.str("");
        }      
        clock_t t_end = clock();      
        cout << t_end - t_start - initial << " ticks\n";
    }   
    return 0;
}

_________________
yo. life's so bloody short.
Ihr dachtet Schulfernsehn sei die ultimative Folter? Falsch: Fahrstuhlmusik, extra leise.


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Variablen ausgeben
BeitragVerfasst: 18.06.2009, 13:25 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
VC++ 9.0
Vista Business 32bit

Debug:
begin test: 74 cps: 1000
206 ticks
148 ticks

Release:
begin test: 52 cps: 1000
45 ticks
17 ticks

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Variablen ausgeben
BeitragVerfasst: 18.06.2009, 13:34 
Offline
Moderator
Benutzeravatar

Registriert: 11.03.2007, 20:25
Beiträge: 556
Wohnort: Frankfurt/Main
sry hat sich natürlich ein fehler eingeschlichen.. s[0] statt s bei ss..
jetzt aber:
http://migoto.de/main.cpp

mac os x, gcc 4.2, debug:
begin test: 5713 cps: 1000000
38152 ticks
11005 ticks
release:
begin test: 5620 cps: 1000000
38424 ticks
10947 ticks

_________________
yo. life's so bloody short.
Ihr dachtet Schulfernsehn sei die ultimative Folter? Falsch: Fahrstuhlmusik, extra leise.


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Variablen ausgeben
BeitragVerfasst: 18.06.2009, 14:02 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
Ok dann ergibt sich:

Debug:
begin test: 53 cps: 1000
206 ticks
103 ticks

Release:
begin test: 53 cps: 1000
48 ticks
16 ticks

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 27 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3  Nächste

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de