Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
LKits
HV Guru

liitunud: 06.09.2007
|
23.06.2011 09:27:27
C++ IF mitu tingimust |
|
|
Tere
Kui on soov kokku hoida ressurssi, siis kas on vahet kas kood on
if ( a > 10 && b > 20 && c < 10 ) |
Või
if ( a > 10 )
{
if ( b > 20 )
{
if ( c < 10 ) |
Ehk kas kompilaator võtab neid tingimusi "järjest" või korraga?
Kui näiteks esimene teingimus (a > 10) hoiab kokku TOHUTULT ressurssi, siis kas on vahet, kas tal on veel tingimusi samas IF'is või peaks eraldi käsud panema?
Loodan, et saate aru. Kui mitte, siis küsige lisaks
|
|
Kommentaarid: 13 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
13 |
|
tagasi üles |
|
 |
Andykas
HV veteran

liitunud: 28.08.2004
|
23.06.2011 09:53:54
|
|
|
Pole päris 100% kindel aga kompilaatori jaoks pole vahet, ta peaks optimeerima nii-ehk-naa sellist koodi. Kui nüüd mõne disassembleriga seda koodi vaadata siis peaks näha olema, et seal on ikkagi kõik jumpid eraldi välja toodud, seega lõpptulemus on ikkagi see, et on mitu rida erinevaid konditsioone ja jumpe, lihtsalt programmeerijal on kiirem/lihtsam/mugavam defineerida neid ühte if-i.
|
|
Kommentaarid: 25 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
22 |
|
tagasi üles |
|
 |
LKits
HV Guru

liitunud: 06.09.2007
|
|
Kommentaarid: 13 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
13 |
|
tagasi üles |
|
 |
t
HV vaatleja
liitunud: 28.06.2010
|
23.06.2011 10:12:05
|
|
|
Konkreetselt selles küsimuses on asi keele standardis fikseeritud.
Kui on jõudluse kysimus, siis üldjuhul on ainuõige korraldada katse (benchmark) ja teha mõõtmisi, mitte püüda oletuste pealt arutleda. Samas pädeva katsetuse tegemine ei ole triviaalne.
Avaldise arvutamisest:
When using the logical operators, C++ only evaluates what is necessary from left to right to come up with the combined relational result, ignoring the rest. Therefore, in this last example ((5==5)||(3>6)), C++ would evaluate first whether 5==5 is true, and if so, it would never check whether 3>6 is true or not.
http://www.cplusplus.com/doc/tutorial/operators/
|
|
Kommentaarid: 3 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
3 |
|
tagasi üles |
|
 |
LKits
HV Guru

liitunud: 06.09.2007
|
|
Kommentaarid: 13 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
13 |
|
tagasi üles |
|
 |
mikk36
HV Guru

liitunud: 21.02.2004
|
23.06.2011 12:46:45
|
|
|
&& puhul käiakse nkn kõik if'i elemendid läbi kuna sa ise nõuad seda, || puhul vaid niipalju kui vaja. See peaks igas kompileerijas/keeles kehtima optimeerimimse eesmärgil.
|
|
Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
2 :: |
78 |
|
tagasi üles |
|
 |
LKits
HV Guru

liitunud: 06.09.2007
|
23.06.2011 13:29:27
|
|
|
&& puhul ei pea ju kõiki elemente läbi kontrollima, sest kui juba üks tingimus ei kehti, siis pole ju vaja ka edasi liikuda.
|| puhul samuti - kui juba üks tingimus kehtib, siis pole vaja järgmisi kontrollida.
|
|
Kommentaarid: 13 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
13 |
|
tagasi üles |
|
 |
Ohohh
Kreisi kasutaja

liitunud: 13.09.2003
|
23.06.2011 13:50:07
|
|
|
Seda, kas tehted tehakse kõik ära või ainult niipalju kui vaja, on väga lihtne kontrollida. Selleks ei pea midagi asmis debugima hakkama
if (foo() && bar()) {
}
Kui foo tagastab false, siis vaatad, kas läheb bar'i sisse või mitte.
|
|
Kommentaarid: 6 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
6 |
|
tagasi üles |
|
 |
LKits
HV Guru

liitunud: 06.09.2007
|
23.06.2011 14:08:30
|
|
|
Nja... loogiline... peaks ise selliste asjade peale tulema
Igal juhul. Kõigile suured tänud abistamise eest. Eks katsetan nüüd edasi iseseisvalt
|
|
Kommentaarid: 13 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
13 |
|
tagasi üles |
|
 |
mikk36
HV Guru

liitunud: 21.02.2004
|
23.06.2011 14:46:39
|
|
|
lkits, pidasin silmas kõikide läbi kontrollimise all seda et senikaua kuni if'i läbimine võimalik on. Mitteläbiva tingimuse korral peatatakse edasine kontrollimine tõesti.
|
|
Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
2 :: |
78 |
|
tagasi üles |
|
 |
Ho Ho
HV Guru

liitunud: 16.02.2002
|
25.06.2011 23:09:24
|
|
|
Huvi pärast küsin mida see kood sul teeb et niivõrd oluline on tingimuslausete optimeerimine?
Kui nende puhul tahad maksimaalset jõudlust siis oleks kõige mõistlikum teha feedback'il põhinevat optimeerimist. Tean, et nii GCC kui ICC seda toetavad kuid hetkel paraku ei meenu mis parameetritega ning mis selle asja õige nimi oli Igatahes ideeliselt nägi asi välja sedasi, et kompileerid oma programmi ära teatud võtmetega, lased sellel joosta näidisandmete peal ning tekitada koodi täitmise kohta logifailid mille kompilaatorile ette söödad teistkordseks kompileerimiseks. Sellise info järgi saab kompilaator näiteks otsustada millises järjekorras võiksid olla nood if lause tingimused et kõige vähem branch mispredictioneid tekiks lisaks ka posule muudele võimalikele optimeerimistele.
Aga loomulikult enne kui nii low-level asja juurde minna tasuks väga sügavalt järgi mõelda kas optimeerimisel üldse mingi mõte on ning kas asjale lähenetakse õigest suunast. Mina isiklikult pole senise poole elu jooksul progemisel veel kordagi kohanud kus peaks hakkama tingimuslauseid ümber kirjutama kiiruse taga ajamiseks ning ma ei saa väita nagu poleks mul vaja olnud üpriski performance-critical kraami kirjutada.
_________________ Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity" |
|
Kommentaarid: 106 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
86 |
|
tagasi üles |
|
 |
LKits
HV Guru

liitunud: 06.09.2007
|
|
Kommentaarid: 13 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
13 |
|
tagasi üles |
|
 |
Ho Ho
HV Guru

liitunud: 16.02.2002
|
26.06.2011 08:21:57
|
|
|
lkits kirjutas: |
No juhul, kui ühe tingimusega loetakse miljoneid mälu aadresse läbi, siis on vast ikka vaja neid filtreerida... |
Sõltub. Räägi veidi täpsemalt mis on sisendid, mis soovitud väljundid ja mis algoritme kasutad. Raudselt annab asja kõvasti kiirendada enne tingimuslausete kallale minekut.
_________________ Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity" |
|
Kommentaarid: 106 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
86 |
|
tagasi üles |
|
 |
LKits
HV Guru

liitunud: 06.09.2007
|
|
Kommentaarid: 13 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
13 |
|
tagasi üles |
|
 |
Ho Ho
HV Guru

liitunud: 16.02.2002
|
26.06.2011 08:27:30
|
|
|
lkits kirjutas: |
Las ülejäänu olla nii nagu on. |
Kurb, just mõtlesin et täna miskit eriti tarka teha pole ja väike ajugümnastika halba ei teeks
_________________ Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity" |
|
Kommentaarid: 106 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
86 |
|
tagasi üles |
|
 |
Fukiku
Kreisi kasutaja

liitunud: 06.11.2003
|
26.06.2011 12:17:13
|
|
|
lkits kirjutas: |
Kindlasti annab, aga sain teada, mis soovisin Las ülejäänu olla nii nagu on. |
Aga tegelikult oleks ju äge, kui sa oma avastusi ka siin jagaksid. Huvi juba kütsid üles poistel ja jätsid nüüd kuivale.
_________________ Foxic is just a simple fox
Enne kui sa küsid oma küsimuse - küsi seda vannipardilt! Rangelt soovitatav enne programmeerimise alafoorumisse uue teema tegemist. |
|
Kommentaarid: 2 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
 |
Ohohh
Kreisi kasutaja

liitunud: 13.09.2003
|
27.06.2011 03:04:07
|
|
|
Te proovite mõelda olukorda keerulisemaks, kui see tegelikult on.
Kui ma õigesti aru saan, siis lkits'il on lihtsalt kaks kontrollitavat tingimust, kus üks on ressursinõudlik ja teine väga kiire. Tema küsimus seisnes selles, et kui ta paneb need ühte if'i järjest, et kas ta saab kindel olla, et keerulisemat ei hakta kontrollma, kui lihtsam annab juba negatiivse.
if (a>b && mingiKeerulineAsi()) {
}
Kus "mingiKeerulineAsi" võib olla näiteks päring andmebaasi poole, mida ei ole vaja hakata tegema, kui a<=b.
|
|
Kommentaarid: 6 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
6 |
|
tagasi üles |
|
 |
|