Es ist einige Monate her, seit ich meine Position als Softwareentwickler für Einsteiger begonnen habe. Nachdem ich einige Lernkurven hinter mir habe (z. B. Sprache, Jargon, Syntax von VB und C #), konzentriere ich mich auf esoterischere Themen, um bessere Software zu schreiben.
Eine einfache Frage, die ich einem Kollegen stellte, wurde mit "Ich konzentriere mich auf die falschen Dinge" beantwortet. Obwohl ich diesen Kollegen respektiere, bin ich nicht der Meinung, dass dies eine "falsche Sache" ist, auf die man sich konzentrieren sollte.
Hier war der Code (in VB) und gefolgt von der Frage.
Hinweis: Die Funktion GenerateAlert () gibt eine Ganzzahl zurück.
Dim alertID as Integer = GenerateAlert()
_errorDictionary.Add(argErrorID, NewErrorInfo(Now(), alertID))
vs ...
_errorDictionary.Add(argErrorID, New ErrorInfo(Now(), GenerateAlert()))
Ich habe das letztere ursprünglich geschrieben und es mit der "Dim alertID" umgeschrieben, damit es jemand anderem leichter fällt, es zu lesen. Aber hier war meine Sorge und Frage:
Sollte man dies mit der Dim AlertID schreiben, würde es tatsächlich mehr Speicherplatz beanspruchen; endlich, aber mehr, und sollte diese Methode oft aufgerufen werden, könnte sie zu einem Problem führen? Wie wird .NET mit diesem Objekt umgehen? AlertID. Außerhalb von .NET sollte man das Objekt nach Gebrauch manuell entsorgen (gegen Ende des Sub).
Ich möchte sicherstellen, dass ich ein sachkundiger Programmierer werde, der sich nicht nur auf die Speicherbereinigung verlässt. Bin ich über das nachgedacht? Konzentriere ich mich auf die falschen Dinge?
Antworten:
"Vorzeitige Optimierung ist die Wurzel allen Übels (oder zumindest des größten Teils davon) in der Programmierung." - Donald Knuth
Wenn es um Ihren ersten Durchgang geht, schreiben Sie einfach Ihren Code, damit er korrekt und sauber ist. Wenn später festgestellt wird, dass Ihr Code leistungskritisch ist (es gibt Tools, mit denen dies als Profiler bezeichnet werden kann), kann er neu geschrieben werden. Wenn Ihr Code nicht als leistungskritisch eingestuft wird, ist die Lesbarkeit weitaus wichtiger.
Lohnt es sich, sich mit diesen Themen Leistung und Optimierung zu befassen? Absolut, aber nicht auf den Dollar Ihres Unternehmens, wenn es unnötig ist.
quelle
Ja, für ein durchschnittliches .NET-Programm ist es ein Überdenken. Es kann vorkommen, dass Sie genau wissen möchten, was in .NET vor sich geht, aber dies ist relativ selten.
Einer der schwierigen Übergänge, die ich hatte, war in den 90er Jahren der Wechsel von C und MASM zur Programmierung in klassischem VB. Ich war es gewohnt, alles auf Größe und Geschwindigkeit zu optimieren. Ich musste dieses Denken größtenteils loslassen und VB es tun lassen, um effektiv zu sein.
quelle
Wie mein Kollege immer sagte:
Mit anderen Worten, denken Sie immer an KISS (halten Sie es einfach dumm). Aufgrund von Überentwicklung kann das Überdenken einer Codelogik ein Problem sein, um die Logik beim nächsten Mal zu ändern. Es ist jedoch immer empfehlenswert, den Code sauber und einfach zu halten .
Mit der Zeit und Erfahrung würden Sie jedoch besser wissen, welcher Code riecht und bald optimiert werden müsste.
quelle
Lesbarkeit ist wichtig. Obwohl in Ihrem Beispiel, ich bin nicht sicher , dass Sie wirklich die Dinge zu machen , Das besser lesbar. GenerateAlert () hat einen guten Namen und fügt nicht viel Rauschen hinzu. Es gibt wahrscheinlich bessere Verwendungsmöglichkeiten für Ihre Zeit.
Ich vermute es nicht. Dies ist eine relativ einfache Optimierung für den Compiler.
Die Verwendung einer lokalen Variablen als Vermittler hat keine Auswirkungen auf den Garbage Collector. Wenn der Speicher von GenerateAlert () new aktiv ist, ist dies von Bedeutung. Dies ist jedoch unabhängig von der lokalen Variablen von Bedeutung oder nicht.
AlertID ist kein Objekt. Das Ergebnis von GenerateAlert () ist das Objekt. AlertID ist die Variable. Wenn es sich um eine lokale Variable handelt, handelt es sich lediglich um einen mit der Methode verknüpften Speicherplatz, um den Überblick zu behalten.
Dies ist eine schwierigere Frage, die vom jeweiligen Kontext und der Besitzersemantik der von GenerateAlert () bereitgestellten Instanz abhängt. Was auch immer die Instanz erstellt hat, sollte sie im Allgemeinen löschen. Ihr Programm würde wahrscheinlich erheblich anders aussehen, wenn es unter Berücksichtigung der manuellen Speicherverwaltung entwickelt würde.
Ein guter Programmierer verwendet die ihm zur Verfügung stehenden Werkzeuge, einschließlich des Garbage Collectors. Es ist besser, Dinge zu überdenken, als ahnungslos zu leben. Sie konzentrieren sich vielleicht auf die falschen Dinge, aber da wir hier sind, können Sie es genauso gut lernen.
quelle
Lass es funktionieren, mach es sauber, mach es FEST, dann mach es so schnell, wie es funktionieren muss .
Das sollte die normale Reihenfolge sein. Ihre allererste Priorität ist es, etwas zu schaffen, das die Abnahmetests besteht, die die Anforderungen nicht erfüllen. Dies ist Ihre erste Priorität, da dies die erste Priorität Ihres Kunden ist. Erfüllung der funktionalen Anforderungen innerhalb der Entwicklungsfristen. Die nächste Priorität besteht darin, sauberen, lesbaren Code zu schreiben, der leicht zu verstehen ist und daher von Ihrer Nachwelt ohne WTFs gepflegt werden kann, wenn dies erforderlich wird (es ist fast nie eine Frage des "Wenn"; Sie oder jemand, nachdem Sie gehen müssen) wieder rein und etwas ändern / reparieren). Die dritte Priorität besteht darin, den Code an die SOLID-Methode anzupassen (oder GRASP, wenn Sie dies bevorzugen), die Code in modulare, wiederverwendbare, austauschbare Blöcke unterteilt, die wiederum die Wartung unterstützen (sie können nicht nur verstehen, was Sie getan haben und warum). Es gibt jedoch klare Linien, entlang derer ich Codeteile chirurgisch entfernen und ersetzen kann. Die letzte Priorität ist die Leistung; Wenn Code wichtig genug ist, um den Leistungsspezifikationen zu entsprechen, ist er mit ziemlicher Sicherheit wichtig genug, um zuerst korrekt, sauber und FEST gemacht zu werden.
In Anlehnung an Christopher (und Donald Knuth) ist "vorzeitige Optimierung die Wurzel allen Übels". Darüber hinaus sind die von Ihnen in Betracht gezogenen Optimierungen sowohl geringfügig (ein Verweis auf Ihr neues Objekt wird auf dem Stapel erstellt, unabhängig davon, ob Sie ihm im Quellcode einen Namen geben oder nicht) als auch von einem Typ, der möglicherweise keinen Unterschied bei der Kompilierung verursacht IL. Variablennamen werden nicht in die IL übertragen. Da Sie die Variable also unmittelbar vor ihrer ersten (und wahrscheinlich einzigen) Verwendung deklarieren, würde ich etwas Biergeld darauf wetten, dass die IL zwischen Ihren beiden Beispielen identisch ist. Ihr Mitarbeiter hat also 100% Recht. Sie suchen an der falschen Stelle, wenn Sie die benannte Variable im Vergleich zur Inline-Instanziierung suchen, um etwas zu optimieren.
Mikrooptimierungen in .NET sind es fast nie wert (ich spreche von 99,99% der Fälle). In C / C ++ vielleicht, WENN Sie wissen, was Sie tun. Wenn Sie in einer .NET-Umgebung arbeiten, sind Sie bereits weit genug vom Metall der Hardware entfernt, sodass die Codeausführung einen erheblichen Aufwand verursacht. Angesichts der Tatsache, dass Sie sich bereits in einer Umgebung befinden, die angibt, dass Sie die Geschwindigkeit der Blasenbildung aufgegeben haben und stattdessen "richtigen" Code schreiben möchten, ist die Komplexität einer .NET-Umgebung nicht schnell genug zu hoch, oder Sie sollten überlegen, es zu parallelisieren. Hier sind einige grundlegende Hinweise zur Optimierung. Ich garantiere Ihnen, dass Ihre Produktivität bei der Optimierung (Geschwindigkeit, die für die aufgewendete Zeit gewonnen wird) in die Höhe schnellen wird:
if(myObject != null && myObject.someProperty == 1)
) oder B mehr als 9-mal länger als A benötigt, um (if(myObject != null && some10SecondMethodReturningBool())
) zu bewerten .quelle
Die einzige Zeit, in der Sie sich frühzeitig Gedanken über die Optimierung machen müssen, ist, wenn Sie wissen, dass Sie mit etwas zu tun haben, das entweder riesig ist oder von dem Sie wissen, dass es sehr oft ausgeführt wird.
Die Definition von "riesig" hängt offensichtlich davon ab, wie Ihre Zielsysteme aussehen.
quelle
Ich würde die zweizeilige Version einfach bevorzugen, weil es einfacher ist, mit einem Debugger durchzugehen. Eine Leitung mit mehreren eingebetteten Anrufen macht es schwieriger.
quelle