Rýchlosť algoritmu s použitím STL – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Rýchlosť algoritmu s použitím STL – C / C++ – Fórum – Programujte.comRýchlosť algoritmu s použitím STL – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
devilfish0
Stálý člen
11. 3. 2012   #1
-
0
-

Zdravim,

Na vstupe je prvy riadok pocet testov n (int) a nasledne 2n riadkov, pricom vzdy jeden test pozostava z dvoch riadkov - prvy pocet časov (int) a druhy časy (double).

Algoritmus prechadza vsetky casy a hlada hodinovy interval ktory pokryva najviac casov <cas,cas+1>. Po overeni vsetkych intervalov ten najlepsi vyhodi a analogicky opakuje az kym neurci vsetky intervaly pre vsetky casy.

Nebojte sa nechcem aby ste mi to nakodili :). Ide mi o to ze mam dva kody ktore robia presne to iste len jeden pouziva STL a jeho triedu list na ulozenie casov a s tym prisluchajuce operacie (sort,erase...). Druhy kod ukladay casy do pola a pouziva C-ckovsky qsort.

Problem je ze STL kod trva neporovnatelne (extremne) pomalsie ako ten druhy. Testovaci vstup ma 10 testov 10k,15k,20k,25k,30k,35k,40k,45k,50k,55k. Kod so standartnym polom zbehne cely za cca 20s a ten s STL len prvy test(10 000) trva 1m15s! Moja otazka a ziadost o radu na vas je preco je to tak, pripadne co tam mam zle, jednoducho pricina.

Dakujem!

 STL code:

#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <list>
#include <algorithm>
#include <iostream>

FILE *f = stdin;

void getIntervals();

int main()
{
	int pocetTestov;
	fscanf(f,"%d",&pocetTestov);
	for(int j = 0;j<pocetTestov;j++)
	{
		getIntervals();
	}
	return 0;
}

void getIntervals()
{
	int bestValue = 0;
	int value = 0;
	int pocetIntervalov = 0;
	int pocetVlakov;
	double time;

	std::list<double>::iterator it;
	std::list<double>::iterator current;
	std::list<double>::iterator bestBegin;//potrebujeme kvoli vymazaniu najdeneho intervalu
	std::list<double>::iterator bestEnd;//potrebujeme kvoli vymazaniu najdeneho intervalu

	std::list<double> * pArriveTimes = new std::list<double>;
	std::list<double> & arriveTimes = *pArriveTimes;

	fscanf(f,"%d",&pocetVlakov);

	for(int i=0;i<pocetVlakov;i++)//nacitanie casov
	{
		fscanf(f,"%lf",&time);
		arriveTimes.push_back(time);
	}

	arriveTimes.sort();//sortnutie

	while(!arriveTimes.empty())//iterujeme az kym neziskame vsetky intervaly
	{
		value = bestValue = 0;
		current = arriveTimes.begin();//nastavime sa na zaciatok
		while(current != arriveTimes.end())//iterujeme pokial nie sme na konci listu casov
		{
			time = *current;
			for(it = current;it != arriveTimes.end();it++)//spocitame kolko casov zahrnuje interval
			{
				if(*it>=time+1.0)
					break;
				value++;
			}
			if(value>bestValue)//je pocet zahrnutych casov vacsi ako zatial najvacsi?
			{
				bestValue = value;
				bestBegin = current;//aby sme vedeli na konci interval vymazat
				bestEnd = it;//aby sme vedeli na konci interval vymazat
			}
			value = 0;
			current++;//ideme skusat dalsi interval
		}
		pocetIntervalov++;
		arriveTimes.erase(bestBegin,bestEnd);// vymazanie intervalu z listu casov
	}
	printf("%d\n", pocetIntervalov);
}

Basic code:

#include <stdio.h>
#include <stdlib.h>

int compare (const void * a, const void * b)		// funkcia na porovnanie pre kniznicnu funkciu Quicksort
{
	if (*(double*)a > *(double*)b)
		return 1;
	if (*(double*)a < *(double*)b)
		return -1;
	if (*(double*)a == *(double*)b)
		return 0;	
}

int main ()
{
	int n,i,j,t,test,x,akt,pocetvintervale,najporadie,najpocetnejsi,zamestnanci;
	double *pole;
	double konint;

	scanf("%d", &test);

	for(t=1;t<=test;t++){									//zaciatok cyklu testov

	scanf("%d", &n);

	pole = (double *) malloc(n * sizeof(double));			

	for (i=0; i<n;i++){										// nacitanie pola
		scanf("%lf", pole+i);
	}
	qsort (pole, n, sizeof(double), compare);				// usporiadanie pola
	zamestnanci = 0;



	while(n!=0){

	n = n-1;
	najpocetnejsi = 0;

	for(j=0;j<=n;j++){										// cyklus na prejdenie vsetkych prvkov pola
		akt = j;
		konint = pole[akt]+1;
		pocetvintervale=0;
		while(akt<=n && pole[akt]<=konint+0.000001){		// pocitanie pocetnosti intervalov pre konkretnu poziciu
			akt++;
			pocetvintervale++;
		}
		if (pocetvintervale>najpocetnejsi){					// zapamatanie najpocetnejsieho intervalu, pozicie a poctu
			najpocetnejsi=pocetvintervale;
			najporadie = j;
		}
	}
	
	while(najporadie<=n-najpocetnejsi){							//skratenie pola o pocet prvkov najpocetnejsieho intervalu
		pole[najporadie] = pole[najporadie+najpocetnejsi];		//od zaciatku miesta najdeneho intervalu postupne umiestnujeme hodnoty za intervalom, cim ho prekryjeme
		najporadie++;
	}
	n=n-najpocetnejsi+1;
	zamestnanci++;
	}
		
	printf("%d\n", zamestnanci);
	free(pole);
	}
	return 0;
}
Nahlásit jako SPAM
IP: 188.121.172.–
Reklama
Reklama
KIIV+42
God of flame
11. 3. 2012   #2
-
0
-

10 000 000 hodnot jedno kolo:

v stl serazene za cca 15 sekund  (jen serazene!!)

to same pomoci qsort za 3.5 (jen serazene!!)

samozrejme musis pocitat s tim ze stl ma trochu vetsi rezii okolo dynamicke pameti a tak...

1 000 000 hodnot i s naplnenim dat:

qsort 0.307s

stl: 1.144

takze sou relativne ekvivalentni

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
devilfish0
Stálý člen
11. 3. 2012   #3
-
0
-

Problem je ze ten samotny greedy algoritmus trva strasne dlho v tom STL kode.....

Nahlásit jako SPAM
IP: 188.121.172.–
ondra.holub+1
Stálý člen
11. 3. 2012   #4
-
+1
-
Zajímavé

V C používáš vestavěný qsort. Řadíš tedy souvislé pole.

V C++/STL řadíš list. Tedy kontejner, kde není náhodný přístup k jednotlivým prvkům. Takže srovnáváš nesrovnatelné. Zkus zjistit, jaký bude rozdíl, pokud budeš řadit vektor.

Další věc je, že zbytečně alokuješ ten kontejner pArriveTimes na heapu a pro jistotu ho už nikdy neuvolňuješ. Výsledek to nějak extra asi neovlivní, ale neodpovídá to pak kódu v C.

Nahlásit jako SPAM
IP: 212.96.189.–
KIIV+42
God of flame
11. 3. 2012   #5
-
0
-

no v obou to delas uplne jinak..  u qsortu nic nemazes... a kdyz si vemes ze kazda polozka ve vectoru je dynamicky alokovana samostatne... a pak i ten vektor ma urcitou dalsi rezii ... tak kazdy mazani je docela zdlouhavy

EDIT: jo a koukam ze tu jeste pisu o vectoru ale je to fakt list :D

EDIT2:

milion polozek s vektorem:  0.5s

10 milionu polozek s vektorem:  5.5s

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
devilfish0
Stálý člen
11. 3. 2012   #6
-
0
-

Podla toho co som pozeral na nete tak list::sort() by mal mat priemernu zlozitost O(nlogn) takze v tom to byt nemoze. Pri tom mojom testovacom vstupe je prvy test 10k, nacitanie aj sortnutie prvkov je hned len ten samotny greedy ide asi 1m15s. Pricom v tom C kode to zbehne okamzite.

ondra: Pamat sa uvolni ked skonci program, ale ano mas pravdu mal by som to dealokovat.

Nahlásit jako SPAM
IP: 188.121.172.–
KIIV+42
God of flame
11. 3. 2012   #7
-
+1
-
Zajímavé

by ses divil... O(n*log(n)) je jen pro samotnej algoritmus.. jestli nema primej pristup je to pomalejsi a evidentne minimalne 3x

proc nepouzijes stejny algoritmus jako mas v C se std vectorem? bude to fungovat jako pole

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
devilfish0
Stálý člen
11. 3. 2012   #8
-
0
-

No, pouzil som list lebo som potreboval mazat vzdy nejaky interval, co je pri spajanom zozname jednoduchsie. Keby som pouzil pole vznikla by mi medzera a musim vsetko poposuvat.

Ale ide o to ze ano ten sort vectora je trochu rychlejsi ako listu ale to nie je hlavny problem. Ako som pisal vyssie pre vstup 10 000 mi ten C algoritmus zbehne hned ale ten STL mi ide asi 1m15s avsak sort je spraveny okamzite, takze nieco zdrzuje vnutri toho cyklu ale neviem co....

Nahlásit jako SPAM
IP: 188.121.172.–
KIIV+42
God of flame
11. 3. 2012   #9
-
0
-

tak to zmer... od ceho sou profilery?

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
devilfish0
Stálý člen
11. 3. 2012   #10
-
0
-

tak ja neviem. Zmeral som si casy a

Jedna iteracia toho cyklu v tom C kode

	while(n!=0){
	n = n-1;
	najpocetnejsi = 0;

	for(j=0;j<=n;j++){										// cyklus na prejdenie vsetkych prvkov pola
		akt = j;
		konint = pole[akt]+1;
		pocetvintervale=0;
		while(akt<=n && pole[akt]<=konint+0.000001){		// pocitanie pocetnosti intervalov pre konkretnu poziciu
			akt++;
			pocetvintervale++;
		}
		if (pocetvintervale>najpocetnejsi){					// zapamatanie najpocetnejsieho intervalu, pozicie a poctu
			najpocetnejsi=pocetvintervale;
			najporadie = j;
		}
	}
	
	while(najporadie<=n-najpocetnejsi){							//skratenie pola o pocet prvkov najpocetnejsieho intervalu
		pole[najporadie] = pole[najporadie+najpocetnejsi];		//od zaciatku miesta najdeneho intervalu postupne umiestnujeme hodnoty za intervalom, cim ho prekryjeme
		najporadie++;
	}
	n=n-najpocetnejsi+1;
	zamestnanci++;
	}

Trva 0,001s

Jedna iteracia toho cyklu v STL kode

	while(!arriveTimes.empty())//iterujeme az kym neziskame vsetky intervaly
	{
		value = bestValue = 0;
		current = arriveTimes.begin();//nastavime sa na zaciatok
		while(current != arriveTimes.end())//iterujeme pokial nie sme na konci vectoru casov
		{
			
			time = *current + 1.0;
			for(it = current;it != arriveTimes.end() && *it<time;it++)//spocitame kolko casov zahrnuje interval
			{
				value++;
			}		
			if(value>bestValue)//je pocet zahrnutych casov vacsi ako zatial najvacsi?
			{
				bestValue = value;
				bestBegin = current;//aby sme vedeli na konci interval vymazat
				bestEnd = it;//aby sme vedeli na konci interval vymazat
			}
			value = 0;
			current++;//ideme skusat dalsi interval

			
			//printf("GREEDY: %lfs\n",kurva);
			
		}	
		pocetIntervalov++;	
		arriveTimes.erase(bestBegin,bestEnd);// vymazanie intervalu z vectoru casov	
	}

Trva  0,27s (na zaciatku, ptm klesa lebo ubuda prvkov)

Skusil som pouzit aj namiesto std::list std::vector a jedine sort sa zrychlil trochu ale ta iteracia stale trva tak dlho. Takze fakt neviem no....

Nahlásit jako SPAM
IP: 188.121.172.–
KIIV+42
God of flame
11. 3. 2012   #11
-
0
-

kdyz tam mas ten vektor tak zkus pouzit kod co mas pro double pole[]  ...  (tj vector<double> pole;)

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
devilfish0
Stálý člen
11. 3. 2012   #12
-
0
-

Ked som pouzil C kod len som namiesto obycajneho pola pouzil std::vector tak sa cas tej iteracie co som pisal zvysil na cca 0,009 - 0,01. Takze jedine co mi z toho vychadza je ze samotne pouzitie triedy vector/list uz to cele spomaluje a ak este pouzivam na iterovanie objekt triedy std::vector<double>::iterator (a + mozno este funkciu vector::erase) tak je to este pomalsie, a to dost vyrazne

Nahlásit jako SPAM
IP: 188.121.172.–
KIIV+42
God of flame
11. 3. 2012   #13
-
0
-

ale aspon je to jen cca 10x pomalejsi nez primej pristup - a neni to tak strasny - ono to v pameti vypada setsakramentsky jinak nez jeden alokovanej blok jako v C kodu

oproti tomu tech 0.27 to uz je dejme tomu 270x pomalejsi

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
devilfish0
Stálý člen
11. 3. 2012   #14
-
0
-

no to ano, len som cakal ze pouzijem STL a bude pohodicka a nakoniec sa aj tak vyplati klasicke pole.....pretoze v tomto pripade (ked nepouzijem erase ani neiterujem pomocou iteratora....) tak je uplne zbytocne aby som pouzil vector...akurat mi to spomali 10x ako si pisal. Lepsie ako 270x ale ten kod je uz uplne rovnaky ako pri pouziti obycajneho pola tak nie je dovod si to spomalit 10x.....

Nahlásit jako SPAM
IP: 188.121.172.–
KIIV+42
God of flame
11. 3. 2012   #15
-
0
-

#14 devilfish
jde o to ze se o to pole nemusis starat... muzes pridavat a mazat jak se ti zlibi ... to ma ale svoji cenu - prirozene

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
devilfish0
Stálý člen
11. 3. 2012   #16
-
0
-

Ano pravdu mas......ale napriklad aky ma vyznam iterovat s tym iteratorom ked je to podstatne pomalsie ako klasicky? Ake to prinasa vyhody (okrem toho ze nemusim poznat velkost pola, co vacsinou poznam)?

Nahlásit jako SPAM
IP: 188.121.172.–
vitamin+8
Grafoman
11. 3. 2012   #17
-
0
-

Mozes pouzit mnozstvo univerzalnych funkcii ktore pracuju s iteratormi.

Nahlásit jako SPAM
IP: 178.143.60.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
yaqwsx+9
Posthunter
11. 3. 2012   #18
-
0
-

#16 devilfish
Já žil v domění, že iterátor u vectoru je definován jako pointer na datavý typ; tzn vector<int>::iterator je definován jako int*. Tomu tak není?

Nahlásit jako SPAM
IP: 85.160.41.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
ondra.holub+1
Stálý člen
11. 3. 2012   #19
-
0
-

Nevím tedy, jakým způsobem a na čem jsi to měřil. Mně vyšlo toto:

prekladac ||  C++/STL   | C
==========++============+==============
gcc 4.6.1 ||  6.9s      | 6.28s
msvc VS10 ||  6.15s     | 4.7s

C varianta je pomalejší, ale není to rozhodně tak zásadní rozdíl, jak píšeš. Nechal jsem tvůj zdroják bez úprav. Spustil jsem to na vygenerovaný vstup (pokaždé stejný) o délce cca 33MB. Jednou.

Pokud to pouštíš na nějaký kratší vstup vícekrát (vícekrát funkci getIntervals), tak si uvědom, že tam máš pokaždé jednu alokaci paměti navíc. Třeba to také hraje roli. Nechce se mi s tím laborovat:

	// Misto tohoto
	std::list<double> * pArriveTimes = new std::list<double>;
	std::list<double> & arriveTimes = *pArriveTimes;

        // staci toto
	std::list<double> arriveTimes;

Pokud to předěláš na vektor, bude asi trošku rychlejší sort, pomalejší bude mazání, protože všechny ostatní položky se musí přesunout tak, aby všechno bylo uloženo v jednom souvislém bloku. Mazání v listu je rychlé.

Dále, když načítáš data do vektoru a dopředu víš, jaká bude potřeba délka vektoru, je vhodné si ten vektor předalokovat pro správnou velikost metodou reserve. Vyhneš se tím realokacím, které také něco stojí.

V každé iteraci znovu vyhodnocuješ arriveTimes.end(), i když je to pro cyklus invariant. To sice možná může překladač vyoptimalizovat, ale já bych se na to nespoléhal.

Po aplikaci těchto kroků jsem v gcc dosáhl přibližně stejných časů v C i v STL variantě. V MSVC to bylo dokonce v STL variantě rychlejší (ale nesnažil jsem se optimalizovat tu C variantu). Stejně jako MSVC na windows xp se chovalo i gcc v linuxu.

Nahlásit jako SPAM
IP: 212.96.189.–
devilfish0
Stálý člen
11. 3. 2012   #20
-
0
-

#19 ondra.holub
No tak ja neviem.

To s tou alokaciou na halde som tam ani povodne nemal - ok odstranil som

Neviem ci si to teda testoval s vektorom alebo listom, ale aj ked som robil s vectorom tam pri deklaracii som konstruktoru hodil velkost tak to by malo byt ekvivalentne ako reserve ci?

Tak list::end() ti len vrati iterator tak to snad nie je taky problem, ale dobre osetril som to.

Kompilujem to msvc VS10 a ide to pomaly jak hovado.

Testujem to na tomto vstupe

http://dl.dropbox.com/u/17549232/inputProgramujtecom.txt

Nahlásit jako SPAM
IP: 188.121.172.–
ondra.holub+1
Stálý člen
12. 3. 2012   #21
-
0
-

#20 devilfish
Můžu vyzkoušet večer. Z práce se na dropbox nedostanu.

Nahlásit jako SPAM
IP: 194.138.12.–
ondra.holub+1
Stálý člen
12. 3. 2012   #22
-
+1
-
Zajímavé

#20 devilfish
Takže jsem to zkusil přesně se zde uvedenými zdrojáky na přiložený vstup. V první řadě je třeba říct, že ty programy určitě nedělají totéž - v C variantě dostanu stejný výstup jak v gcc tak v msvc. Ten se ovšem liší od výsledku v C++/STL, který je dokonce různý s různými překladači:

C gcc i msvc | C++/STL gcc | C++/STL msvc
-------------+-------------+-------------
1105         | 1120        | 11211654         | 1657        | 1657
2202         | 2225        | 2225
2756         | 2799        | 2799
3320         | 3366        | 3366
3874         | 3921        | 3921
4425         | 4484        | 4484
4975         | 5026        | 5027
5523         | 5590        | 5590
6116         | 6154        | 6154

Ale nebudu hledat chybu v algoritmu, který neznám. Zde jsou časy:

      gcc         |     msvc          
 C      | C++/STL | C       | C++/STL | po úpravě
--------+---------+---------+---------+------------
 21.2   | 37.588  | 22.83   | 38.777  | 21.601
 21.923 | 37.907  | 23.134  | 39.247  | 21.656
 21.562 | 38.197  | 22.957  | 39.378  | 21.287
===================================================
 21.562 | 37.897  | 22.974  | 39.134  | 21.515
       1.75x déle |         1.7x déle | 0.936x déle (tedy 1.068x kratší dobu)

Upravený zdroják jsem zkoušel už jenom v msvc, v gcc se mi nechtělo to sepisovat (nicméně trvalo to cca 18.95s, tedy bylo to opět rychlejší než C varianta). Tady je ten upravený zdroják:

#include <cstdio>
#include <cstdlib>
#include <vector>
#include <algorithm>

FILE *f = stdin;

void getIntervals();

int main()
{
	int pocetTestov;
	fscanf(f,"%d",&pocetTestov);
	for(int j = 0;j<pocetTestov;j++)
	{
		getIntervals();
	}
	return 0;
}

void getIntervals()
{
	int bestValue = 0;
	int value = 0;
	int pocetIntervalov = 0;
	int pocetVlakov;
	double time;

	std::vector<double>::iterator it;
	std::vector<double>::iterator current;
	std::vector<double>::iterator bestBegin;//potrebujeme kvoli vymazaniu najdeneho intervalu
	std::vector<double>::iterator bestEnd;//potrebujeme kvoli vymazaniu najdeneho intervalu

	fscanf(f,"%d",&pocetVlakov);

	std::vector<double> arriveTimes;
    arriveTimes.reserve(pocetVlakov);

	for(int i=0;i<pocetVlakov;i++)//nacitanie casov
	{
		fscanf(f,"%lf",&time);
		arriveTimes.push_back(time);
	}

	std::sort(arriveTimes.begin(), arriveTimes.end());//sortnutie

	while(!arriveTimes.empty())//iterujeme az kym neziskame vsetky intervaly
	{
		value = bestValue = 0;

		const std::vector<double>::const_iterator END = arriveTimes.end();
		current = arriveTimes.begin();//nastavime sa na zaciatok
		while(current != END)//iterujeme pokial nie sme na konci listu casov
		{
			const double time = *current + 1.0;
			for(it = current; it != END; ++it)//spocitame kolko casov zahrnuje interval
			{
				if(*it >= time)
					break;
				value++;
			}
			if(value>bestValue)//je pocet zahrnutych casov vacsi ako zatial najvacsi?
			{
				bestValue = value;
				bestBegin = current;//aby sme vedeli na konci interval vymazat
				bestEnd = it;//aby sme vedeli na konci interval vymazat
			}
			value = 0;
			++current;//ideme skusat dalsi interval
		}
		pocetIntervalov++;
		arriveTimes.erase(bestBegin,bestEnd);// vymazanie intervalu z listu casov
	}
	printf("%d\n", pocetIntervalov);
}

Každopádně by to chtělo vyladit ty chyby, aby se porovnávaly programy se stejným výstupem.

Nahlásit jako SPAM
IP: 212.96.189.–
devilfish0
Stálý člen
13. 3. 2012   #23
-
0
-

No takze co sa tyka toho odlisneho vystupu pri C kode tak to bude tym bola dilema ci sa bere interval <a,a+1) alebo <a,a+1>. Takze v kazdom kode to je opacne, ale to je nepodstatne. Co sa tyka miernej odchylky v STL kode pri kompilacii v gcc a msvc tak to vazne netusim, ja som to kompiloval iba na msvc.

A co do rychlosti.....uz som vazne zmateny.

Hodil som presne ten tvoj kod pre STL (cize ten moj s malymi upravami). Zbehne mi rychlejsie ale stale je to sialene.

v msvc:

C - 27,077s

STL/C++ - 2160,603s

Nahlásit jako SPAM
IP: 188.121.172.–
ondra.holub+1
Stálý člen
13. 3. 2012   #24
-
0
-

#23 devilfish
A máš zapnuté optimalizace na rychlost? Bez nich nemá měření rychlosti smysl.

Nahlásit jako SPAM
IP: 194.138.12.–
devilfish0
Stálý člen
13. 3. 2012   #25
-
0
-

Asi nie kedze ani neviem co to je, resp kde sa to nastavuje etc. :). Ale keby mi obidva kody isli pomaly.....ale ked ide len jeden.....ci ?

Nahlásit jako SPAM
IP: 147.175.120.–
ondra.holub+1
Stálý člen
13. 3. 2012   #26
-
0
-

#25 devilfish
Záleží na tom, co má ten překladač nastavené jako default. To může být různé, pokud překládáš z příkazové řádky nebo makefilem, a jiné, pokud to za tebe dělá nějaké vývojové prostředí. Vzhledem k tomu, že jeden zdroják je v C a druhý v C++, tak defaultní nastavení se můžou lišit.

Jestli máš visual studio, tak si spusť cmd, tam zadej vcvars32.bat (pokud není v cestě, tak si to najdi někde tam, kde je visual studio nainstalované). Pak to přelož jako cl /O2 zdrojak.cpp

V IDE to bude někde v nastavení projektu, to z hlavy nedám.

Nahlásit jako SPAM
IP: 194.138.12.–
yaqwsx+9
Posthunter
13. 3. 2012   #27
-
+1
-
Zajímavé

#25 devilfish
Napadlo mě - kompiluješ pod build nebo debug profilem? V debug profilu je u STL mnoho balastu, který ji brzdí, ale umožňuje podrobné debugování.

Nahlásit jako SPAM
IP: 85.160.62.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
devilfish0
Stálý člen
13. 3. 2012   #28
-
0
-

#27 yaqwsx
Si na to kapnul :). Po prepnuti do realese profilu :

Vylepseny kod by ondra - 12.1s.

Moj povodny kod - 18.435s

Diky za pomoc chlapi.

Nahlásit jako SPAM
IP: 147.175.120.–
yaqwsx+9
Posthunter
13. 3. 2012   #29
-
0
-

#28 devilfish
Jsem rád, že jsem na to kápnul. Psal jsem to spíše jako poslední výkřik...

BTW: Jaké je teď porovnání C/STL v release módu?

Nahlásit jako SPAM
IP: 85.160.62.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
devilfish0
Stálý člen
13. 3. 2012   #30
-
0
-

Release mod:

C - 12,692s

STL/C++(vector) - 11,87s

STL/C++(list) - 18,13s

Nahlásit jako SPAM
IP: 188.121.172.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 83 hostů

Podobná vlákna

STL kontejnery — založil vdolek

STL knihovna — založil JanP

Vector v STL — založil yaqwsx

STL map, ci existuje prvok... — založil Tom@sQo

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý