Hirdetés

2024. május 2., csütörtök

Gyorskeresés

Hozzászólások

(#2001) martonx válasza [pod]Diablo (#1999) üzenetére


martonx
veterán

Mi lenne, ha a gombokat gomb1, gomb2, ... néven hívnád. Így gombnyomáskor a gomb nevéből meg tudod állapítani, hogy hanyadik elem.

Én kérek elnézést!

(#2002) fatal` válasza martonx (#2001) üzenetére


fatal`
titán

LOL hogy ez nem jutott eszembe, pedig régen én is ezt csináltam. De ott van még a tag property is, de ha jól látom azt már valami másra használja.

Esetleg ha nem akarja átnevezni őket, akkor kacifántosabban le lehet származtatni a buttonból egy osztályt, aminek csinál egy int propertyt erre a célra, és abban tárolja, hogy hanyadik elem a tömbben, így elég azt lekérdezni.

(#2003) #90999040 válasza fatal` (#2000) üzenetére


#90999040
törölt tag

A név szerinti keresés szerintem gyorsabb. De ha ez nem lehetséges, akkor a for helyett a foreach talán gyorsabb. :)

(#2004) fatal` válasza #90999040 (#2003) üzenetére


fatal`
titán

És foreachel hogy nyeri ki az indexet abban a megoldásban amit írtam? :) Név szerintivel nyílván működni fog, de akkor az még nem jutott eszembe. :)

[ Szerkesztve ]

(#2005) #90999040 válasza fatal` (#2004) üzenetére


#90999040
törölt tag

Valahogy így:

private int hanyadikgomb(Button button)
{
int i = 0;
for each(Button elem in tomb)
{
if (button.Equals(elem)
{
return i;
}
i ++;
}
}

(#2006) kingabo válasza [pod]Diablo (#1999) üzenetére


kingabo
őstag

Ha pl egy groupbox-ot használsz amibe csak a gombok vannak, akkor így is megkapod a sorszámát a gombnak:
int sorSzam = groupBox1.Controls.IndexOf((Control)sender);
A sorrendet a gb-hez való hozzáadás fogja jelenteni. (ha kódból pakolod bele, akkor a korábbinak lesz a kisebb sorszáma, ha az összehúzogatós felületen raktad össze a gui-t, akkor fordított)

(#2002) hunfatal: folyamatosan növel egy i változót. :P

(#2005) emonitor: megelőztél. De ennek így mi értelme? Kell ehhez még egy plusz változó amit szintén karban kell tartanod... Ha azt kiveszed, akkor meg megkaptad a for-t. :U

[ Szerkesztve ]

(#2007) fatal` válasza #90999040 (#2005) üzenetére


fatal`
titán

Ez szerintem nem lesz gyorsabb, mint a sima for.

(#2008) #90999040 válasza fatal` (#2007) üzenetére


#90999040
törölt tag

(#2009) fatal` válasza #90999040 (#2008) üzenetére


fatal`
titán

Ez rendben van csak te bevezettél még egy i változót, itt meg nem azt csinálja. :)

Mondjuk gondolom én nincsen 120 000 gombja így a sebességkülönbség majdhogynem elhanyagolható és sokkal szebb a kód a sima forral, mint a plusz változóval, amit külön kell kezelni.

De egyébként az egész úgy is kuka, mert névre keres akkor sima foreach. :)

(#2010) #90999040 válasza fatal` (#2009) üzenetére


#90999040
törölt tag

Te nem használsz plussz változót?
for ( int i = 0; i < tombhossz; i++)

(#2011) fatal` válasza #90999040 (#2010) üzenetére


fatal`
titán

De igen csak a ciklus végén meg is szűnik. Ellentétben a tieddel ami ottmarad a függvény végéig. :)

Továbbra is azt mondom hogy jelen esetben a sima for szebbé teszi a kódot és a sebességkülönbség elhanyagolható.

Persze ha 150 000 gombja van akkor más a helyzet. :D

[ Szerkesztve ]

(#2012) kingabo válasza #90999040 (#2010) üzenetére


kingabo
őstag

int i = 0;
for each(Button elem in tomb)

Hunfatal erről beszél. (meg én is)

(#2013) #90999040 válasza kingabo (#2012) üzenetére


#90999040
törölt tag

Értem amit mondasz.
Mondjuk Hunfatal szerintem nem erről beszélt.

tomb
és
Button elem in tomb

Mind a kettő Button-t ad vissza. Hát nem tudom...
Ha több időm lesz kipróbálom.

(#2014) bpx válasza #90999040 (#2008) üzenetére


bpx
őstag

"A név szerinti keresés szerintem gyorsabb. De ha ez nem lehetséges, akkor a for helyett a foreach talán gyorsabb."

majd az általad linkelt cikkben:

"Therefore, I strongly feel if you are planning to write high performance code that is not for collections, use for loop. Even for collections, foreach may look handy when using, but it's not that efficient. Therefore, I strongly recommend everyone to use for loop rather than foreach at any stage."

(#2015) shev7 válasza bpx (#2014) üzenetére


shev7
veterán

igen, ezt en sem ertettem... mert a cikk szerint is egyertelmu a for elonye performace szempontjabol...

''Gee, Brain, what do you want to do tonight?'' ''The same thing we do every night, Pinky: Try to take over the world!''

(#2016) Lortech válasza bpx (#2014) üzenetére


Lortech
addikt

Mondjuk itt elég nagyvonalú, amikor collectionst említ, mikor kb. az indexerrel rendelkezőkre gondol. Mi van például egy linkedlisttel, stackkel, queue-val for esetén.. Én nem állnék neki kézzel iterálni ezeket, inkább foreach / getEnumerator, többet ér egy olvasható kód, mint 10 milliszekundum.
Fordítva is igaz, ha index is kell, akkor meg inkább for, ha van indexere a típusnak, ha meg nincs, úgyis csúnya lesz.

Thank you to god for making me an atheist

(#2017) shev7 válasza Lortech (#2016) üzenetére


shev7
veterán

itt nem is ez a lenyeg, hanem sokkal inkabb az, hogy a kolega azt allitotta, hogy a foreach gyorsabb mint a for, majd linkelt egy irast, ami pont az ellenkezojerol beszel...

''Gee, Brain, what do you want to do tonight?'' ''The same thing we do every night, Pinky: Try to take over the world!''

(#2018) Lortech válasza shev7 (#2017) üzenetére


Lortech
addikt

Azt értem, én a cikket kritizáltam for foreach viszonyában, előbbiekbe nem akarván belefolyni.

Thank you to god for making me an atheist

(#2019) #90999040 válasza kingabo (#2012) üzenetére


#90999040
törölt tag

Volt egy kis időm, így sikerült leellenőriznem. Pont az ellenkezője jött ki, mint amire számítottam. Az eltérés -3 / +3 % volt a 2 között. A foreach azonban kis méretű tömbnél és/vagy kevés hívás esetén volt gyorsabb, nagy méretű tömb és/vagy sokszori hívás esetén pedig a for volt gyorsabb. Az eltérés azonban mindkét esetben minimális volt. Mondjuk 1 millós tömb és 1000-szeri meghívás esetén 0,4 másodperc volt az eltérés a for javára.

shev7 és -Zeratul- : igazatok van, ezt benéztem. :W

Mindenesetre az is érdekes, hogy az equals itt is csak akkor haszálható, ha előtte "=" (tehát értékadással) lett a 2 button egyenlővé téve.

(#2020) fatal` válasza #90999040 (#2019) üzenetére


fatal`
titán

Ha már így tesztelgetsz. :)

for ciklusban itt is a ++i gyorsabb mint az i++, mint C++ban? Nincs kedved megnézni?:)

(#2021) #90999040 válasza fatal` (#2020) üzenetére


#90999040
törölt tag

Ha már így tesztelgetsz

Tudod, én szeretem az objektív dolgokat, és ha valamiben nincs igazam, akkor azt beismerem, ellentétben egyesekkel.

(#2022) fatal` válasza #90999040 (#2021) üzenetére


fatal`
titán

Elárulnád, hogy miért személyeskedsz? Szerintem semmi sértő nem volt abban amit írtam, csak úgy gondoltam, ha már éppen tesztelés közben vagy akkor megnézhetnéd ezt is...

(#2023) #90999040 válasza fatal` (#2022) üzenetére


#90999040
törölt tag

Mikor állítottam, hogy ++i lassabb, mint i++?

(#2024) kingabo válasza #90999040 (#2023) üzenetére


kingabo
őstag

Félre érted! Megkért, hogyha így benne vagy a tesztelgetésben (készen vannak a teszt kódok), akkor légy szíves ennek a dolognak is nézz utána. Semmi rosszindulat nem volt benne! :N

"ha már elmentél a boltba kenyérért, hozhatnál tejet is" ;)

[ Szerkesztve ]

(#2025) #90999040 válasza kingabo (#2024) üzenetére


#90999040
törölt tag

Jó, csak, hogy objektív eredményt kapjak, ahhoz elég sok folyamatot le kell állítani.
Az előző tesztnél is 1 milló Button-nál a lapozófájl mérete 406 milló bájttal növekedett és a teszt alatt a proci 100%-on ment.

De azért ezt is leteszteltem.
void ciklus0()
{
int i = 0;
i++;
}

void ciklus1()
{
int i = 0;
++i;
}

Ezeket hívtam meg 100 millószor. Az eredmény:
120,815924676848 sec. a ciklus0-ra és
120,841825454048 sec a ciklus1-re
az eltérés 0,020 %, tehát nagyon minimális.
Egyébként a tesztelő programot elteszem, mert még máskor is jól jöhet, de mondjuk sűrűn nem használom a proci terhelése miatt.

(#2026) fatal` válasza #90999040 (#2023) üzenetére


fatal`
titán

Ezekszerint az i++ minimálisan, de gyorsabb. :) Meglepő.

Köszi a tesztet :)

[ Szerkesztve ]

(#2027) #90999040 válasza #90999040 (#2025) üzenetére


#90999040
törölt tag

A minimális eltérés miatt azonban nem merném kijelenteni, hogy ez szignifikáns eredmény, inkább az a valószínűbb, hogy azonos sebességűnek tekinthetők.
Nem lehet, hogy fordításnál ugyanúgy fordítja? :U

(#2028) #90999040 válasza #90999040 (#2027) üzenetére


#90999040
törölt tag

Jó volt a meglátásom. Megnéztem assembly-ben a kódokat. Íme:

A ciklus0(); :

.method private hidebysig instance void ciklus0() cil managed
{
// Code size 8 (0x8)
.maxstack 2
.locals init ([0] int32 i)
IL_0000: nop
IL_0001: ldc.i4.0
IL_0002: stloc.0
IL_0003: ldloc.0
IL_0004: ldc.i4.1
IL_0005: add
IL_0006: stloc.0
IL_0007: ret
} // end of method Form1::ciklus0

A ciklus1(); :

.method private hidebysig instance void ciklus1() cil managed
{
// Code size 8 (0x8)
.maxstack 2
.locals init ([0] int32 i)
IL_0000: nop
IL_0001: ldc.i4.0
IL_0002: stloc.0
IL_0003: ldloc.0
IL_0004: ldc.i4.1
IL_0005: add
IL_0006: stloc.0
IL_0007: ret
} // end of method Form1::ciklus1

(#2029) fatal` válasza #90999040 (#2028) üzenetére


fatal`
titán

Ezekszerint mindegy. Köszi a részletes elemzést. :)

(#2030) #90999040 válasza fatal` (#2029) üzenetére


#90999040
törölt tag

De ha már itt tartunk: A foreach 16 bájttal hosszabb, mint a for. :))

(#2031) bpx


bpx
őstag

csak hogy kötözködjek egy picit :D

static void Main(string[] args)
{
long a;

long start1 = DateTime.Now.Ticks;

for (long i = 0; i < 20000000000;)
a = i++;

DateTime dt = new DateTime(DateTime.Now.Ticks - start1);
Console.WriteLine("i++ : {0} sec, {1} ticks", dt.Second, dt.Ticks);

long start2 = DateTime.Now.Ticks;

for (long i = 0; i < 20000000000; )
a = ++i;

dt = new DateTime(DateTime.Now.Ticks - start2);
Console.WriteLine("++i : {0} sec, {1} ticks", dt.Second, dt.Ticks);
Console.ReadLine();
}

i++ : 51 sec, 519749728 ticks
++i : 49 sec, 492008142 ticks

i++ : 52 sec, 521009800 ticks
++i : 49 sec, 492998197 ticks

i++ : 52 sec, 520389764 ticks
++i : 49 sec, 493708238 ticks

akárhányszor futtatom, megvan a 2,6-2,7 mp körüli különbség

a másodiknál assembly-ben kevesebb a mov

[ Szerkesztve ]

(#2032) #90999040 válasza bpx (#2031) üzenetére


#90999040
törölt tag

Na jó, de ez nem csak assemblyben különbözik, hanem "a"-ra nézve a kimenet is más. :K

(#2033) kingabo válasza #90999040 (#2032) üzenetére


kingabo
őstag

A ciklusváltozó szempontjából ment a vizsgálat, hogy az i++ vagy a ++i a gyorsabb, tehát az 'a' értéke a fentiek miatt lényegtelen. De ha zavar, a kód végére írsz egy --a-t. ;)

(#2034) #90999040 válasza kingabo (#2033) üzenetére


#90999040
törölt tag

Tudom, azért van ott a mosolygós bábu. Erre reagáltam:
csak hogy kötözködjek egy picit

(#2035) takyka77


takyka77
tag

Sziasztok!
Azt szeretném kérdezni, hogy a Visual Studio 2010. Professional változatot hány gépen tudom használni, ha megvásárolom?

(#2036) Lortech válasza takyka77 (#2035) üzenetére


Lortech
addikt

hali.

Idézet az EULA-ból:

[...]
1. OVERVIEW.

a. Software. The software includes development tools, software programs and documentation.

b. License Model. The software is licensed on a per user basis.

2. INSTALLATION AND USE RIGHTS.

a. General. One user may install and use copies of the software to design, develop, test and demonstrate your programs. You may not use the software on a server in a production environment.
[...]

Ebből én azt szűröm le, hogy szerver gépet leszámítva akárhány gép(ed)re felinstallálhatod, de csak te használhatod értelemszerűen.

[ Szerkesztve ]

Thank you to god for making me an atheist

(#2037) takyka77 válasza Lortech (#2036) üzenetére


takyka77
tag

Oké, köszönöm szépen.

(#2038) fatal` válasza takyka77 (#2035) üzenetére


fatal`
titán

Az EULA alapján userhez van kötve (1db), nem géphez.:)

(#2039) martonx válasza takyka77 (#2035) üzenetére


martonx
veterán

azért mielőtt elrohansz megvásárolni, én a helyedben megnézném a webspark és a bizspark lehetőségeket.
Ha pedig egyikbe sem esel bele, akkor érdemes e-bay-en venni fillérekért egy kósza 2008-as licenszet, és azt upgradelni 2010-re.

Én kérek elnézést!

(#2040) amargo


amargo
addikt

Ha már így license kérdések vannak, akkor a VSProwMSDN ALNG LicSAPk OLP NL Qlfd esetén miket rakhatok fel? Kimondottan az Expression blend érdekelne.. vagy ezt is meg kell venni?

“The workdays are long and the weekend is short? Make a turn! Bike every day, bike to work too!”

(#2041) martonx válasza amargo (#2040) üzenetére


martonx
veterán

A rövidítéseid poénok akartak lenni? Mindenesetre az Expression Blend külön fizetős :(

Én kérek elnézést!

(#2042) amargo válasza martonx (#2041) üzenetére


amargo
addikt

Ha csak a microsoft is annak szánta.

De talán ez választ adott rá.

[ Szerkesztve ]

“The workdays are long and the weekend is short? Make a turn! Bike every day, bike to work too!”

(#2043) tamas60


tamas60
csendes tag

Kellene egy olyan program ami nagy négyzetbe optimálisan el tudna helyezni adatbázisban szereplő kis négyzeteket. A programot C++ ban kellene megírni.
Akit érdekel a téma keressen meg.
Ha nem jó helyre írtam bocsánat, és kérnék egy tippet hol van ennek a kérésnek helye.

(#2044) amargo válasza tamas60 (#2043) üzenetére


amargo
addikt

Szerintem ide illik talán.

“The workdays are long and the weekend is short? Make a turn! Bike every day, bike to work too!”

(#2045) Alkimista válasza kingabo (#1992) üzenetére


Alkimista
csendes tag

Először is köszi a választ.

Nem meggyőzni akartalak csak a problémára megoldási javaslatot :) Sajna nem mondhatom meg egy cégnek sem, hogy holnaptól sql servert vagy éppen orclet használjon, még csak azt sem hogy ezek melyik verzióját. Legtöbb helyen SQL server 2000 van és nem is tervezik hogy más verzió bevezetését.

Nem egy cégnél van 2 fajta adatbázis hanem cégenként eltérő. Nem én találtam ki ezt a megoldást, csak örököltem a problémát. :)

Bocs hogy nem fogalmaztam egyértelműen, szép napot.

Alkimista

(#2046) Alkimista válasza kingabo (#1992) üzenetére


Alkimista
csendes tag

így igaz :)

Alkimista

(#2047) robotjatek


robotjatek
tag

Sziasztok! Lenne egy nagyon egyszerű kérdésem az objektumokkal kapcsolatban.
Legyen egy világ, benne sok objektummal, a példa kedvéért legyenek ők mondjuk "Emberek". Ezek az emberek élik a saját kis életüket, most random sétálgatnak. Mondjuk jelenítsük meg a helyzetüket egy konzol ablakban, de ez a feladat szempontjából igazából most lényegtelen.
A kérdés: Hogy lehet elegánsan megoldani azt, hogy ugyanarra a koordinátára ne léphessen két "ember"? Tehát, ha mondjuk a (13;14) ponton van már egy objektum, akkor lépjen máshova.

(#2048) fatal` válasza robotjatek (#2047) üzenetére


fatal`
titán

Létrehozáskor végigmész a tömbön/listán, amiben a többi objektum van és ellenőrzöd.

[ Szerkesztve ]

(#2049) martonx válasza robotjatek (#2047) üzenetére


martonx
veterán

csinálsz egy kétdimenziós boolean tömböt, amiben nyilvántartod, hogy melyik objektum, éppen hol van. Ahol van, azt 1-el jelölöd, ahol senki nincs azt nullával. Amikor átlép az objektum egyik mezőről a másikra, akkor ellenőrzöd az ütközést, átfrissíted a tömb két elemét.

Én kérek elnézést!

(#2050) MaUser válasza robotjatek (#2047) üzenetére


MaUser
addikt

Annyit fűznék csak hozzá, hogy minden ilyen esetben a probléma a sparse array problémája. Legjobban olvasható megoldás a 2 dimenzió look-up tömb használata (ahol az indexek a koordináták és az elemek az emberek sorszáma), de ha nagy a világ és kevés benne az ember, akkor list-be illik felfűzni az emberek sorszámát és aktuális pozíciójukat tároló object-eket, majd a listát bejárva azt frissítgetni.

''A file-cserélés öli meg a filmipart? Inkább a filmipar öli meg a file-cserélést. 2 hónapja nincsen semmi értelmes film, amit érdemes lenne letölteni...''

Copyright © 2000-2024 PROHARDVER Informatikai Kft.