was muss ein Progammierer können?



  • @Noesis: dein Rechner muss einer im 166 MHz Bereich sein *fg*



  • Original erstellt von <manu>:
    Hallo!
    was muss ein Programmierer umbedingt können?

    ganz wichtig: kaffee kochen !!



  • hmm... ich hab mir grad den Thread durchgelesen.... ich seh zwischen den beiden Varianten eigntlich keinen Unterschied. Bin zwar müde, und beherrsche Java überhaupt net, aber auch im C++ - code fällt mir so auf den ersten Blick kein Unterschied auf. Worin liegt der jeweils? 😕

    zum Topic:
    ich würde sagen, das wichtigste, was der Programmierer an Voraussetzungen mitbringen muss, ist das Interesse am PC im Allgemeinen... weil alles andere sich normalerweise davon ableiten wird... 🙂

    [ Dieser Beitrag wurde am 04.01.2003 um 01:21 Uhr von Blue-Tiger editiert. ]



  • Schau dir die Schleife genau an. Und dann überleg dir beim java-code wie im Prozessor der L1-Cache aussieht und beim C++-Code, wie hier Register genutzt werden können.



  • Ich habe noch eine 3. Variante hinzugefügt :
    [java]
    public class Test
    {
    public static void main (String [] args)
    {
    int size = 150000;
    System.out.println ("Variante 1 :");
    long time = System.currentTimeMillis();
    {
    int [] values = new int [size];
    for (int i = 0 ; i < 20000 ; ++i)
    {
    for (int j = 0 ; j < size ; ++j)
    {
    ++values[j];
    }
    }
    int a = 0;
    for (int j = 0 ; j < size ; ++j)
    {
    a += values [j];
    }
    System.out.println ("Zahl : " + a);
    }
    System.out.println ("Zeit : " + (System.currentTimeMillis() - time));
    System.out.println ("Variante 2 :");
    time = System.currentTimeMillis();
    {
    int [] values = new int [size];
    for (int j = 0 ; j < size ; ++j)
    {
    for (int i = 0 ; i < 20000 ; ++i)
    {
    ++values [j];
    }
    }
    int a = 0;
    for (int j = 0 ; j < size ; ++j)
    {
    a += values [j];
    }
    System.out.println ("Zahl : " + a);
    }
    System.out.println ("Zeit : " + (System.currentTimeMillis() - time));
    System.out.println ("Variante 3 :");
    time = System.currentTimeMillis();
    {
    int [] values = new int [size];
    for (int j = 0 ; j < size ; ++j)
    {
    int tempValue = 0;
    for (int i = 0 ; i < 20000 ; ++i)
    {
    ++tempValue;
    }
    values [j] = tempValue;
    }
    int a = 0;
    for (int j = 0 ; j < size ; ++j)
    {
    a += values [j];
    }
    System.out.println ("Zahl : " + a);
    }
    System.out.println ("Zeit : " + (System.currentTimeMillis() - time));
    }
    }[/code]
    Ausgabe (mit erhöhter Taktfrequenz gegenüber dem allerersten Test):

    Variante 1 :
    Zahl : -1294967296
    Zeit : 19888
    Variante 2 :
    Zahl : -1294967296
    Zeit : 15903
    Variante 3 :
    Zahl : -1294967296
    Zeit : 6339

    Ich denke, um solche Optimierungen machen zu können, muss man schon etwas Hintergrundwissen über die Hardware etc. haben.

    [ Dieser Beitrag wurde am 04.01.2003 um 09:39 Uhr von Gregor editiert. ]



  • @Gregor: Is zwar OT aber daran sieht man, dass Java in der Hinsicht performance-technisch suckt. Mein C++ Code hat nämlich bereits für Variante 2 eine vergleichbare Zeit ausgegeben. Und wenn man das x &= weglässt hatte Variante 2 die sagenhafte Zeit von 0 Millisekunden *fg*. Sowas traut sich kein java-compiler :D. Wenn dir Hardware so wichtig ist, solltest du auf C++ (+ ASM *g*) umsteigen.



  • @ Mr. N : Ich habe mir eben mal MinGW runtergeladen und dein Programm auf höchster Optimierungsstufe kompiliert.

    Ergebnis :

    Zahl: 20000
    Zeit: 18616
    Zahl: 20000
    Zeit: 28431

    ...irgendwie ist das Ergebnis komisch. Zumindest scheint nicht jeder C++-Compiler so toll zu sein, wie der, den du nutzt.

    Allerdings hast du Recht. javac optimiert nicht so sehr, wie die meisten C++-Compiler. AFAIK werden zum Beispiel keine sinnlosen Schleifen wegoptimiert. Warum auch? Kein Programmierer wird (in realen Programmen) Schleifen programmieren, die eigentlich sinnlos sind. ...zumindest nicht in zeitkritischen Bereichen.



  • Gehen wir das Thema mal anders an, was ist ein Programmieren?

    PROGRAMMIERER, eine Person, die Computerprogramme schreibt und von Fehlern befreit.

    Ein Zitat aus Encarta (Microso**) ... kein wunder bei dem Satz:

    und von Fehlern befreit



  • Es gibt aber auch noch den Spruch:

    Wenn Debugging der Vorgang ist Fehler aus einem Programm zu entfernen,
    so ist Programmierung der Vorgang Fehler in ein Programm einzubauen.



  • Cool... dann dürfen wir uns ja 'Bugger' nennen :D.

    cya 🙂



  • @Gregor: MSVC hat sich aufs sinnlose Schliefen wegoptimieren spezialisiert *g*. Das erschwert allerdings das Benchmarking :D.



  • BTW : Mit g++ ist die zweite Variante ohne Optimierung vom Compiler übrigens schneller, als mit Optimierung vom Compiler! 😃



  • Original erstellt von Mr. N:
    Schau dir die Schleife genau an. Und dann überleg dir beim java-code wie im Prozessor der L1-Cache aussieht und beim C++-Code, wie hier Register genutzt werden können.

    mal 'ne Frage:
    was macht "memset(a, 0, sizeof(a));" (zu meiner Entschudligung: ich bin noch dabei, C++ zu lernen 🙂 ).

    BTW: mit dem BCC55 erhalt ich folgende Zahlen/Zeiten:
    Zahl: 20000
    Zeit: 29906
    Zahl: 20000
    Zeit: 8532



  • @Blue-Tiger: die Zahlen sind gut. Du hast gefragt, was das memset macht? Naja, is ja auch eher ne C Funktion... memset(a, 0, sizeof(a)); füllt sizeof(a) bytes ab a mit dem wert 0. sehr praktisch.



  • Mit Eurem Benchmark zeigt Ihr ein meiner Meinung nach typisches Technikerverhalten, das sehr schön die Defizite vieler Programmierer aufzeigt - Ihr vergleicht gerade Laufzeiten für die Programme, um herauszufinden was schneller ist. Sehr schön.

    Hier aber mal eine nette Geschichte zum nachdenken - und ich erzähle diese nun aus meiner Sicht als Softwareanwender:

    Ich habe einen Scanner Epson Perfection 1200 USB mit Einzelblatteinzug.

    Ein Topgerät, sehr gute optische Qualität, sehr sehr stabile Twaintreiber, noch nie einen Absturz gesehen. Aber ein Manko: wenn ich einen Stapel Papier einlege, so wird für jede Seite beim Scannen ein Fortschrittsbalken in einem Fenster angezeigt - ALS TOPMOST WINDOW! D.h. ca. alle 30 Sekunden klappt ein Fenster in den Vordergrund und zeigt mir den Scanfortschritt. Damit - so ein Scanvorgang kann ja bei 50 Blättern einige Minuten dauern - kann man den Computer während des Scannens für keine andere Aufgabe nutzen, obwohl es von der Performance her überhaupt kein Problem wäre.

    Ergo: die Software ist aus Anwendersicht trotz qualitativ hochwertiger Ausführung SCHEISSE. Weil der Entwickler nicht nachgedacht hat - weil er sich nicht in die Rolle des Anwenders gedacht hat.

    Kommen wir auf die Grundfrage zurück "was muss ein Progammierer können?" - so sollte hier eine Antwort lauten:

    "Ein Programmierer sollte verstehen, was die Anwender mit dem Produkt tun wollen"

    Stabilität von Software ist sicherlich eine Grundvoraussetzung, damit man mit ihr brauchbar arbeiten kann, ohne Frage. Also muß ein Programmierer seine Werkzeuge (aka seine Sprache) sauber beherrschen.

    Es reicht aber nicht aus, sich auf eine Beherrschung der Sprache und Performancekniffe zu beschränken - weil dann gibt's zwar technisch hochwertige Software, die aber leider trotzdem unbrauchbar ist.

    😉



  • Hi!

    Original erstellt von Marc++us:
    **[...]
    Kommen wir auf die Grundfrage zurück "was muss ein Progammierer können?" - so sollte hier eine Antwort lauten:

    "Ein Programmierer sollte verstehen, was die Anwender mit dem Produkt tun wollen"

    Stabilität von Software ist sicherlich eine Grundvoraussetzung, damit man mit ihr brauchbar arbeiten kann, ohne Frage. Also muß ein Programmierer seine Werkzeuge (aka seine Sprache) sauber beherrschen.

    Es reicht aber nicht aus, sich auf eine Beherrschung der Sprache und Performancekniffe zu beschränken - weil dann gibt's zwar technisch hochwertige Software, die aber leider trotzdem unbrauchbar ist.

    ;)**

    Hmm, ...
    Kann ich nicht unbedingt unterschreiben.

    Unternehmen, die groß genug sind, haben ein hinreichend ausgeprägtes Anforderungsmanagement, so dass nicht jeder Programmierer über den vollständigen System-, Nutzungs- und Funktionsumfang informiert werden muss, was ja auch Kosten verursacht.
    'XP' ist nicht immer der Nabel der Weisheit 😉

    cu

    P84



  • Original erstellt von Prof84:
    **
    'XP' ist nicht immer der Nabel der Weisheit 😉
    **

    Ich sehe den Zusammenhang zu XP hier garnicht! 😞 ...bitte erklär ihn mal!



  • @Gregor: Insider-Joke!! 😃



  • So wie bei **Voraus (V_o_r_r_a_u_s), was? 😃

    cya :)**



  • Original erstellt von Prof84:
    Unternehmen, die groß genug sind, haben ein hinreichend ausgeprägtes Anforderungsmanagement, so dass nicht jeder Programmierer über den vollständigen System-, Nutzungs- und Funktionsumfang informiert werden muss, was ja auch Kosten verursacht.

    Naja, mit der Taktik der vollständigen Information wurden aber schon Schlachten gewonnen. 😉


Anmelden zum Antworten