C++-ban a szorzás gyorsabb, ha saját függvényt írnak rá?
int number;
cin >> number;
int times;
cin >> times;
if (i = 0, i < times, i++)
{
result += number;
}
cout << result;
Ilyen kóddal, vagy hasonlóval, ha saját szorzásfüggvényt írna valaki, akkor gyorsabb lenne, mint a sima szorzás?
Vagyis:
int multiplication()
{
if (i = 0, i < times, i++)
{
result += number;
}
cout << result;
}
Azért ennél vannak többszázszor gyorsabb egész szorzó eljárások. Mert ha jól látom itt egész számot szorzol egész számmal.
1./ Ez annyiszor fut le amennyi a szorzó. Eleve ha már ezt az utat választod meg kéne nézni, hogy a szorzó vagy a szorzandó a kisebb, mert ha a szorzandó a kisebb akkor ha megcseréled már azzal gyorsítasz a programodon, és az egy összehasonlítás időigénye lényegesen kisebb, mint esetleg több százszor végig menni a cikluson. Pl. nézzük az alábbi esetet:
number=3 times=123456789
3*123456789 ha így hajtod végre a ciklusod 123456789 esetben fog végrehajtódni, ha előtte megnézed, hogy melyik a kisebb és megfordítod már csak 3x fog végrehajtódni, ezzel már gyorsítottunk nem keveset a programon.
2./ Ha két int-et kell szorozni akkor lehet tudni, hogy az int az 4 byte (32 bit). Két 32 bites számot összeszorozni eleve problémás, mert az eredmény 64 bites lesz. Érdemes egy ellenőrzést csinálni eleve az elején, hogy a két szám szorzata belefog-e férni a 32 bitbe, vagy sem. Vagy eleve feltételezzük, hogy belefér és nem foglalkozunk vele.
De ha int-et szorzol int-el és az eredményt tárolod long long int-be (64 bit) vagy megelégszel, hogy az eredmény 32 bit marad, akkor is létezik olyan eljárás, hogy maga a ciklus max. 32x fut le bármit csinálsz, és magában a ciklus törzsben egy feltételes utasítás és két olyan művelet szerepel amelyiket gyakorlatilag az összes proci ALU-ja el tud végezni, azaz kb. 1:1-ben fordítható gépikódra. így a teljes 32 bites tartományban kb. 100 lépésből bármely két szám szorzata megkapható.
3./ A mai procik ALU-jában benne van az egész szorzás, és a proik FPU-ja lebegőpontos számokat is képes összeszorozni gyakorlatilag "hardwerből" és a fordító ezt fogja meghívni. Ezzel nagony nehéz versenyezni. Max. akkor ha véletlenül olyan prociba fut bele az ember amelyik nem tud szorozni (régebbi 8 bitesek, kisebb 8 bites mikrokontrollerek). Azoknál még van értelme bajlódni a szorzással. De azoknál sem a te algoritmusoddal szoroznak, hanem amit 2-ben írtam, a max 32x lefutó ciklusos változatot használják, mert az kezelhető időben is. És nem lesz beláthatatalan a futásidő.
"C++-ban a szorzás gyorsabb, ha saját függvényt írnak rá?"
Ez nem a nyelvtől, hanem a fordító képességeitől függ.
A mai procikban a szorzóáramkörök hülyére vannak optimalizálva.
ezen túltenni csak úgy lehet, ha figyeljük az operandusokat és ha azok kettő hatványai, akkor shiftelünk. Ezért írtam a shaft-ot, hátha valakinél valami derengeni kezd, felébred csipkerózsika álmából és emlékszik a tanultakra.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!