excray napisał: Pewnie. A później amatorzy programowania dzięki takiemu podejściu zapisują proste zmienne jako float albo nie wiedzą jaka jest różnica dla działania programu pomiędzy dzieleniem przez 8 a dzieleniem przez 9. Wiedza o asemblerze jeszcze nikomu nie zaszkodziła czego nie można powiedzieć o niewiedzy.
Odpowiedziałbym jednak cytatem, że "premature optimization is the root of all evil" (; A może z tymi floatami jednak się wyrobi (sprawdzałeś, czy jak większość zakładasz że na pewno nie?), a może właśnie zamiast dzielić przez 8 ktoś musi dzielić przez 9 i wymyślanie przez pół dnia algorytmu który zaoszczędzi 1ms dziennie nie ma sensu? (; Trochę luzu [; Również w sprawie floatów, bo wbrew pozorom do wielu zastosowań są "wystarczająco szybkie", nawet na AVR (; Przykład? Jeśli masz użytkownikowi pokazać wynik obliczeń na LCD to co za różnica czy będzie musiał poczekać na niego 1us czy 1ms?
Do tego żeby wiedzieć czy float jest "za ciężki" czy nie, nie trzeba wcale być mistrzem assemblera, wystarczy pomyśleć przez 15 sekund.
Nie mówiąc już o tym, że używając na początku float można od razu otrzymać poprawny wynik, a potem na zasadzie porównania dojść do algorytmu bez liczb zmiennoprzecinkowych (jeśli w ogóle jest potrzeba - patrz cytat). A że niektórzy od razu wolą optymalizować wszystko, nawet jak nie ma to sensu...
Od razu dodam, że jak ktoś musi oszczędzać pamięć, bo już się kończy (lub ma pewność że się skończy w w trakcie rozbudowy programu), to taka "optimization" nie jest "premature". Co innego jak ktoś pisze program który zajmie 20kB na układ który ma 128kB pamięci, ale profilaktycznie oszczędza każdy bajt...
Z drugiej zaś strony jak ktoś jest prawdziwym h4x0rem to np zamiast napisać tak:
a = tablica((++i) % 8);
będzie pisał tak:
a = tablica[(++i) & 7];
tylko na podstawie błędnego założenia, że kompilator by sam na to nie wpadł, obniżając czytelność programu. Albo jeszcze lepszy przykład dla prawdziwych optimization-masters:
if (zmienna & 0x80) // załózmy że zmienna jest int8_t
no i co to niby znaczy? O co tu chodzi? Równoważny kod:
if (zmienna < 0)
tutaj również kompilator by na to sam nie wpadł, wiec trzeba mu "pomóc".
Na zakończenie powiem tyle - jak ktoś uważa, że kompilatorowi trzeba pomagać optymalizować program w takich bzdurnych miejscach, to niech zrobi dwie rzeczy:
1. podejrzy assemblera wygenerowanego przez kompilator w obydwóch przypadkach (oczywiście na włączonej optymalizacji) i stwierdzi czy jest różnica na "+" dla wersji trV-h4x0r
2. przeczyta sobie ten tekst -
http://c2.com/cgi/wiki?PrematureOptimization
Dla kompletności podaję KOMPLETNY cytat:
Cytat: There is no doubt that the grail of effi-
ciency leads to abuse. Programmers waste
enormous amounts of time thinking about,
or worrying about, the speed of noncritical
parts of their programs, and these attempts
at efficiency actually have a strong negative
impact when debugging and maintenance are
considered. We should forget about small
efficiencies, say about 97% of the time: pre-
mature optimization is the root of all evil.
Yet we should not pass up our opportuni-
ties in that critical 3 %. A good programmer
will not be lulled into complacency by such
reasoning, he will be wise to look carefully
at the critical code; but only after that code
has been identified. It is often a mistake to
make a priori judgments about what parts
of a program are really critical, since the
universal experience of programmers who
have been using measurement tools has been
that their intuitive guesses fail.
http://sbel.wisc.edu/Courses/ME964/Literature/knuthProgramming1974.pdf
4\/3!!