Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » STL Performance, die 2.

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 <
010
10.04.2009, 00:22 Uhr
Bruder Leif
dances with systems
(Operator)


Die Bibel hab ich mir mit einem Shell-Skript und lynx --dump vom Projekt Gutenberg gezogen, und in eine 4MB-Datei verpackt. Ich such mal nach ner Moeglichkeit, das irgendwo hochzuladen; mein Rechner ist nicht mehr 24/7 online
--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
11.04.2009, 18:29 Uhr
~pizer
Gast


Hier ist eine alternative C++ Version, die bei mir etwa 60% schneller läuft.

C++:
#include <iostream>
#include <ostream>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <utility>
#include <ctime>
#include <cstdlib>
#include <cassert>

using std::string;
using std::set;
using std::map;
using std::make_pair;
using std::pair;
using std::vector;
using std::cout;
using std::endl;

struct my_str_comp_t
{
    // Die genaue Reihenfolge ist ja nicht so wichtig
    // Diese Sortierung ist ein kleines bischen schneller
    bool operator()(string const& a, string const& b)
    {
        const string::size_type al = a.length();
        const string::size_type bl = b.length();
        if (al==bl)
            return a<b;
        else
            return al<bl;
    }
};

int main()
{
    using std::srand;
    using std::rand;
    using std::time;

    typedef pair<const string*,const string*> str_ptr_pair_t;
    typedef vector<const string*> str_ptr_vector_t;

    // Speichere jedes Wort nur einmal ab im "Wort Cache".
    // Dann werden nur noch zeiger auf const strings benutzt.
    set<string, my_str_comp_t> words;
    map<str_ptr_pair_t,str_ptr_vector_t> triples;

    srand(time(NULL));

    const string* pw1 = 0;
    const string* pw2 = 0;
    string temp;
    while (std::cin >> temp) {
        const string* pi = & * words.insert(temp).first;
        // pi zeigt auf string object im cache
        triples[make_pair(pw1,pw2)].push_back(pi);
        pw1 = pw2;
        pw2 = pi;
    }
    triples[make_pair(pw1, pw2)].push_back(
                & * words.insert(".").first
            );

    pw1 = pw2 = 0;
    for (int n=0; n<1000; ++n) {
        str_ptr_vector_t const& third = triples[make_pair(pw1,pw2)];
        assert(!third.empty());
        const string* pi = third[rand() % third.size()];
        // pi zeigt auf string object im cache
        if (*pi == ".") break;
        cout << *pi << ' ';
        pw1 = pw2;
        pw2 = pi;
    }
    cout << endl;

    return 0;
}



Bzgl string-Zuweigung: Ich würde eigentlich vermuten, dass

C++:
  w1 = w2;
  w2 = i;


langsamer ist (zumindest wenn die c++stdlib Implementierung kein "copy-on-write" benutzt, was ja wieder aus der Mode zu kommen scheint) als

C++:
  w1.swap(w2);
  w2.swap(i);
  // i == altes w1, ist aber egal in diesen Fall



Vielleicht probiert mal jemand noch "unordered_set" bzw "unordered_map" von Boost/TR1 aus...

Gruß,
pizer
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
12.04.2009, 09:28 Uhr
mike
Pinguinhüpfer
(Operator)


@Bruder Leif: Kleiner Tweak vl. noch:
string w1="" => string w1 = String.Empty;
Schneller und schont Ressourcen

lg
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
12.04.2009, 16:47 Uhr
0xdeadbeef
Gott
(Operator)


std::basic_string hat keinen Member Empty, lediglich eine Funktion empty(), die dir sagt, ob der String leer ist. Ich nehme an, du meinst

C++:
w1.clear();


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
12.04.2009, 16:48 Uhr
mike
Pinguinhüpfer
(Operator)


@0xdeadbeef: Ähm vergessen. Mein Kommentar bezog sich auf das C# Schnippsl
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: