Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Borland Turbo C++ Explorer a Borland C++ builder

12 Paź 2009 19:37 3719 4
  • Poziom 18  
    Witam,
    od pewnego czasu tworzę pewien programik, używałem darmowego TurboC++ Explorera ale byłem trochę zmartwiony powolnością programu, postanowiłem ten sam projekt otworzyć w Borland C++ Builder Enterprise (zkrakowany) i skompilować. Okazało się że jest duża różnica w szybkości działania skompilowanego programu, np. wczytanie 6 MB pliku zajmowało 7 sekund (program skompilowany w TurboC++) a teraz zajmuje 1.5 sekundy (C++Builder Enterpise).
    Oczywiście kompilowałem w obu przypadkach z optymalizacją na szybkość (release).

    Chciałbym żeby mój programik był full legalny i też do zastosowań komercyjnych.
    Czy Turbo C++ jest po prostu wolniejszy, słabiej optymalizuje kod ,czy może jest jakaś opcja w kompilatorze o której nie wiem.

    Czytałem gdzieś że darmowe Visual C++ Expres edition nie ma dobrej optymalizacji ale można ściągnąć sobie jakieś darmowe narzędzie do optymalizacji.

    Może podobna sytuacja jest z Turbo C++?
  • Moderator Programowanie
    Zainteresuj się RAD Studio, poszukaj na stronie Embarcadero , powinni udostępniać RAD 2009 lub 2010 w wersji Personal.
    A jak będziesz chciał coś sprzedać, to się dogadamy :) , mam licencję na RAD 2009 Architect.

    Link
  • Poziom 23  
    Szukaj raczej problemu w swoim kodzie. Między tymi wersjami środowisk zmienił się dostawca STL, drobna różnica w polityce alokacji pamięci i kawałek nieuważnego kodu mogą mieć takie skutki.
    Ewentualnie pokaż minimalne projekty testowe, inaczej trudno będzie pomóc.
  • Poziom 18  
    arnoldziq: prawdę mówiąc nie będę tego sprzedawał, tworzę to dla siebie żeby używać tego potem jako pomoc w pracy, a musi to być 100% legal, bo się przyczepią do mnie.

    ostrytomasz: mój program wczytuje plik tekstowy, rozpoznaje słowa kluczowe i wczytuje wartości do obiektów typu słowo, np wczytuje wiersz: "X100 Y1.111 Z123.456 ; wspolzedne" i tworzy 3 obiekty typu X, Y, Z zawierające wartość double oraz 1 obiekt typu ; zawierający string "wspolrzedne". I te obiekty trzymane są w vetcor<slowo*>

    Tak jak pisałeś, może to coś z rezerwacją pamięci bo używam new około 1-2 miliona razy w czasie wczytywania pliku, ale oprócz tego używam w swoim programie : klasy vector, string oraz iteratorów string::const_iterator , porównywania stringów, oraz funkcji typu atof(), i sprintf()

    oto przykładowa funkcja której tam często używam:
    Code:
    void slowo::czytajFloat(const string & str, string::const_iterator & iter)
    
    {
         static string sWart;//string zawierajacy znaki z wartoscią liczbową
         static int poz;//aktualna pozycja (pomijając spacje),"-"moze byc tylko gdy poz==0
         static int bylaKropka;
         while(iter!=str.end() && *iter==' '){ iter++; }//pominiecie początkowych spacji
         string::const_iterator start = iter;
         poz = 0;
         bylaKropka=0;
         pDigits=0;//potrzebne do formatfloat
         while(iter!=str.end())
         {
          if(*iter>='0'&&*iter<='9')
          {
           if(bylaKropka){pDigits++;}
           iter++;poz++;
           }else if (*iter=='-'){
           if(poz){break;}//'-'moze byc tylko na początku (1 raz)
           if(bylaKropka){break;}
          iter++;poz++;
         }else if(*iter=='.')
         {
          if(bylaKropka){break;}
          else{bylaKropka=1;iter++;poz++;}
         }else {break;}
         }
         sWart = str.substr(start-str.begin(),iter-start);
         //while(iter!=str.end() && *iter==' '){ iter++; }//pominiecie koncowych spacji
         if(sWart.length()){//jak znaleziono jakis ciag znakow
          if(sWart=="-"||sWart=="."||sWart=="-."){czytErr = ERR_BRAK_WART; return ;}
          dVal = atof(sWart.c_str());
          czytErr = ERR_OK;//wszystko ok
          return ;
         }else{
          czytErr = ERR_BRAK_WART;
          return ;
         }
    }

    funkcja wczytuje ze stringu str wartość liczbową, zachowuje ją w dVal i przesuwa iterator na następny znak za wartością liczbową, napewno można by tą funkcję jakoś zoptymalizować, może zrezygnwać z klasy string i używać zwykłych c-stringów, ale czemu u licha jest 5 krotna różnica w czasie wykonywania programu skompilowanego w BCB a TurboC++ ? Można by przenieść implementację klasy string i vector ze starego BCB do środowiska TurboC++ ? To by mogło pomóc?
  • Pomocny post
    Poziom 23  
    Użycie STLport powinno być możliwe, ale gdy patrzę na tę funkcję to nie wiem, czy warto. Wygląda ona, moim zdaniem, cokolwiek patologicznie.

    Czy nie wystarczyłoby użycie sscanf czy StrToFloat?

    Jeżeli szybkość jest kluczowa, to nie warto tworzyć na stosie każdorazowo std::string i iteratorów do niego - te same operacje można wykonać na wczytanym z pliku buforze bez wykonywania żadnych kopii danych czy tworzenia tymczasowych obiektów.

    Milion wywołań new przy przetwarzaniu - to najprowdopobniej 5 rzędów wielkości za dużo, wliczając w to wywołania z wnętrza STL. Nawet alokacje na ewentualne długie/nieznanej długości komentarze mogą być zbędne jeśli np. użyć typu łańcucha ze wskaźnikiem na początek i długością odwołującego się bezpośrednio do bufora do którego wczytano plik.