Nowe posty

Autor Wątek: Szybkość działania.  (Przeczytany 9513 razy)

kamzor

  • Gość
Szybkość działania.
« dnia: 2009-09-27, 00:12:29 »
Witam.

Napisałem pewien programik konsolowy który generuje wielomian wpisanego przez nas stopnia i wpisanego przez nas zakresu współczynników. Po wygenerowaniu podajemy argument i program oblicza wielomian normalnie i według schematu Hornera licząc czasy.

Od dawna słyszy się o Linuksie jako o super szybkom systemie, ale czy na pewno?

Chodzi mi o to że po skompilowaniu programu na Ubuntu w środowisku eclipse czas obliczenia normalnym sposobem wielomianu stopnia 10 000 000 zajmuje około 20 sekund!
A po skompilowaniu programu na Win XP w środowisku Dev-Cpp czas obliczenia normalnym sposobem wielomianu stopnia 10 000 000 zajmuje tylko około 4 sekundy na znacznie słabszym komputerze..

Z czego to wynika?

Dodam że wielkość pliku wykonywalnego na Windows jest ze 3 razy większa ale czy to ma jakieś znaczenie?

Proszę o wyjaśnienie :-)

Offline mateo86

  • Users
  • Guru
  • *****
  • Wiadomości: 647
    • Zobacz profil
Szybkość działania.
« Odpowiedź #1 dnia: 2009-09-27, 15:05:45 »
O ile się orientuję eclipse to chyba środowisko dla javy... Więc po skompilowaniu masz plik, który jest uruchamiany przez wirtualną maszynę javy.

Porównujesz szybkość programów zapisanych w 2 językach programowania na 2 różnych systemach.

Skompiluj na ubuntu w gcc ten sam program co kompilujesz na windows w dev-cpp i wtedy porównuj.

Ew. uruchom plik z javy na komputerze z windows i też porównaj.

kamzor

  • Gość
Szybkość działania.
« Odpowiedź #2 dnia: 2009-09-27, 20:15:15 »
To delikatnie się mylisz bo do eclipse jest pakiet eclipse-cdt pozwalający pisać w C++. Chyba że ja jestem w jakimś wielkim błędzie to proszę mnie uświadomić :)

Więc co wywołuje tę różnicę czasową?

EDIT:

Skompilowałem z linii poleceń ale czas ten sam:

mieszko@mieszko:~$ g++ main.cpp wielomian.cpp -o horner

hex.linux

  • Gość
Szybkość działania.
« Odpowiedź #3 dnia: 2009-09-27, 23:20:28 »
Być może miałeś w Dev-Cpp ustawione jakieś opcję optymalizacji, których nie użyłeś pod Linuksem. Spróbuj dodać przykładowo flagę -O2 do kompilacji i porównaj wyniki.

Co konkretnie robi ta flaga możesz poczytać tutaj:
http://pl.wikipedia.org/wiki/Optymalizacja_kodu_wynikowego

Swoją drogą ciekaw jestem jaka jest faktycznie różnica między systemami, więc jeżeli to nie jest problem to mógłbyć wrzucić tu kod, a z ciekawości sam zobaczę jak to wygląda u mnie.

kamzor

  • Gość
Szybkość działania.
« Odpowiedź #4 dnia: 2009-09-28, 00:38:49 »
Cytat: hex.linux
Być może miałeś w Dev-Cpp ustawione jakieś opcję optymalizacji, których nie użyłeś pod Linuksem. Spróbuj dodać przykładowo flagę -O2 do kompilacji i porównaj wyniki.
Nie odczułem różnicy czasów tylko plik wykonywalny miał 0.3 KB mniej ;)

Cytat: hex.linux
Swoją drogą ciekaw jestem jaka jest faktycznie różnica między systemami, więc jeżeli to nie jest problem to mógłbyć wrzucić tu kod, a z ciekawości sam zobaczę jak to wygląda u mnie.
Znajdujemy się na forum ściśle związanym z FLOSS więc sam bym się nazwał strasznym sku*****nem gdybym tego nie zrobił :)
'Swoją drogą' może ktoś to urozmaici ;)

To jeszcze nie skończony projekt więc posiada tylko obiekt 'wielomian' kontrolowany z funkcji main :)
'Swoją drogą' "responsibility-driven design" jest całkiem wciągającą metodologią projektowania :P

Plik main.cpp:
#include 
#include "wielomian.h"
#include

using namespace std;

int main()
{
while(1)
{
wielomian wiel;
wiel.generuj();
wiel.oblicz();

char odp = 0;
cout << "Czy ponowic (t/n): ";
cin >> odp;

if(odp != 't') break;
}
}
Plik wielomian.h:
#ifndef WIELOMIAN_H_
#define WIELOMIAN_H_

#include
#include
#include
#include
#include

using namespace std;

class wielomian
{
unsigned int stopien;
short int * wsp; //Wskaznik do tablicy wspolczynnikow. Index w tablicy odpowiada stopniowi.

void przedstaw();
void oblicz_norm(short int x);
void oblicz_horn(short int x);

public:
wielomian() : stopien(0), wsp(NULL)
{
}
~wielomian()
{
if(wsp != NULL) delete [] wsp;
}

void generuj();
void oblicz();
};

#endif /*WIELOMIAN_H_*/
Plik wielomian.cpp:
#include "wielomian.h"

void wielomian::generuj()
{
if(wsp != NULL) delete [] wsp;

unsigned int s;
short int x,y;

cout << "Podaj stopien wielomianu ktory ma zostac wygenerowany ('s', gdzie 0 <= s <= 4294967295): ";
cin >> s;

while(1)
{
cout << "\\nPodaj przedzial wspolczynnikow ktore maja zostac wygenerowane ('x y', gdzie -32768 <= x y <= 32767, i x <= y): ";
cin >> x >> y;
if(x > y)
{
cout << "\\nBlad (x > y)\\n";
}
else break;
}

stopien = s;
wsp = new short int[stopien+1]; //Utworzenie dynamicznej tablicy o wielkosci ++stopien.

srand(time(NULL));
for(unsigned int i = stopien ; i > 0 ; i--)
{
wsp[i] = (x + (rand() % (y - x + 1))); //W przedziale znajduje sie y-x+1 liczb. dodanie x sprawi iz wylosowana liczba bedzie pasowac do przedzialu.
}
wsp[0] = (x + (rand() % (y - x + 1)));

przedstaw();
}

void wielomian::przedstaw()
{
char odp = 0;

cout << "Wygenerowano wielomian! Czy wyswietlic (t/n): ";
cin >> odp;
if(odp == 't')
{
cout << "Wygenerowano wielomian:\\n\\tW(x) =";

for(unsigned int i = stopien ; i > 0 ; i--)
{
cout << " " << showpos << wsp[i] << "x^" << noshowpos << i;
}
cout << " " << showpos << wsp[0] << noshowpos << endl;
}
}

void wielomian::oblicz()
{
if(wsp == NULL)
{
cout << "Wielomian nie istnieje!\\n";
return;
}

short int x = 0;

cout << "Podaj wspolczynnik x wielomianu W(x) ('x', gdzie -32768 <= x <= 32767 ): ";
cin >> x;

cout << "\\nMetoda normalna:\\n\\t";
oblicz_norm(x);
cout << "Metoda Hornera:\\n\\t";
oblicz_horn(x);
}

void wielomian::oblicz_norm(short int x)
{
double start, koniec;

start = clock();

long long wynik = 0;
for(long long i = stopien ; i > 0 ; i--)
{
wynik += ((long long)wsp[i] * (long long)pow(x,i));
}
wynik += (long long)wsp[0];

koniec = clock();

cout << "Wynik wielomianu W(x) wynosi: " << wynik << "\\nObliczono w czasie okolo: " << (koniec - start) / CLOCKS_PER_SEC << " sekundy" << endl;
}

void wielomian::oblicz_horn(short int x)
{
double start, koniec;

start = clock();

long long wynik = wsp[stopien];
for(unsigned int i = 0 ; i < stopien ; i++)
{
wynik = wynik * x + wsp[stopien - (i+1)];
}

koniec = clock();

cout << "Wynik wielomianu W(x) wynosi: " << wynik << "\\nObliczono w czasie okolo: " << (koniec - start) / CLOCKS_PER_SEC << " sekundy" << endl;
}
TAK WIĘC PYTANIE ODNOŚNIE PRĘDKOŚCI WYKONANIA JEST WCIĄŻ AKTUALNE!

Offline mateo86

  • Users
  • Guru
  • *****
  • Wiadomości: 647
    • Zobacz profil
Szybkość działania.
« Odpowiedź #5 dnia: 2009-09-28, 10:24:52 »
Być może masz system w jakiś sposób skopany... U mnie linux (2.6.30-gentoo-r4) miażdży windows xp (SP3) :)

C2D @ 1.86 GHz, 2 GB RAM DDR800;

Linux:


Windows:


A może to wina kompilatora? Jaką masz wersję gcc?
Piszesz, ze to na ubuntu odpalasz - ubuntu ma strasznie dużo usług uruchomionych, być może to one zajmują dość spory czas procesora, i temu jest tak wolno.

kamzor

  • Gość
Szybkość działania.
« Odpowiedź #6 dnia: 2009-09-28, 17:10:31 »
gcc (Ubuntu 4.3.3-5ubuntu4) 4.3.3
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
A jak uruchamia się sam system w terminalu? Pamiętam że jest coś takiego ja runlvl..

Rozkminiałem też że może to wina lapka - może jest przeznaczony dla windows.. Ale to chyba nie możliwe.. prawda?

hex.linux

  • Gość
Szybkość działania.
« Odpowiedź #7 dnia: 2009-09-28, 17:59:37 »


U mnie czasy troszkę gorsze bo mam słabszy procesor, ale zdecydowanie pod Linuxem jest szybciej.

Maszyna testowa: Pentium D 3.4Ghz 4GB RAM
Test pierwszy pod Windows 7 64bit. Program skomliwowany DevCpp jako 32-bitowy.
Test drugi ArchLinux (2.6.31) x64 kompilowany pod 64 bit.

btw: Sprawdź może czy żaden proces nie zużywa Ci za dużo zasobów podczas uruchomienia  programu

kamzor

  • Gość
Szybkość działania.
« Odpowiedź #8 dnia: 2009-09-28, 18:28:28 »


Adres screena jeśli słabo widać: http://img230.imageshack.us/img230/1553/proc.png

U was na linuksie zdecydowanie szybciej..
Ja testowałem na 2 różnych maszynach ale mimo to że ta z windowsem była znacznie słabsza to czas był i tak z 5 razy krótszy :(

A mam pytanie które też mnie zastanawiało.. Czy 64-bitowy typ 'long long' na procesorach 32-bitowych ma 64 czy 32 bity?

hex.linux

  • Gość
Szybkość działania.
« Odpowiedź #9 dnia: 2009-09-28, 19:37:54 »
Cytat: kamzor
A mam pytanie które też mnie zastanawiało.. Czy 64-bitowy typ 'long long' na procesorach 32-bitowych ma 64 czy 32 bity?
W praktyce współczesne kompilatory (takie jak GCC) na maszynach 32-bitowych zazwyczaj stosują typy o następujących rozmiarach:

    * short int ma 16 bitów
    * int jest równy long int i ma 32 bity
    * long long int ma 64 bity

żródło:

kamzor

  • Gość
Szybkość działania.
« Odpowiedź #10 dnia: 2009-09-28, 20:45:43 »
aha.. Więc nadal nie wiem dlaczego program u mnie wykonuje się tak długo.. Ktoś jeszcze ma jakiś pomysł ?