Ich habe ein Projekt, bei dem ich die Arithmetik standardmäßig überprüfen lassen möchte, mit Ausnahme einer leistungsempfindlichen Stelle. Leider hat VB.Net keinen 'ungeprüften' Block.
Idealerweise hätte das Framework eine Art Integer-Typ mit explizit ungeprüfter Arithmetik, aber so etwas habe ich nicht gefunden. Ich habe festgestellt, dass Ausdrucksbäume binäre Ausdrücke für ungeprüfte Operationen haben, aber der Delegat-Overhead hebt den unmarkierten Vorteil (und dann einige) auf.
Momentan konvertiere ich die Eingaben in UInt64 / Int64, bevor ich die Arithmetik ausführe, und wandle dann zurück (mit einem bitweisen And, um innerhalb des Bereichs zu gewährleisten). Es ist etwa 50% langsamer als ungeprüfte Arithmetik (nach Profiling).
Das Verschieben des arithmetisch-sensitiven Teils in ein Projekt mit ungeprüfter Arithmetik funktioniert möglicherweise, aber es scheint übertrieben zu sein, ihm eine Assembly ganz zu geben.
Ich persönlich denke, dass es eine gute Option ist, dies in seiner eigenen Versammlung zu belassen, vor allem, weil es so eine kleine Versammlung sein wird. Dies erleichtert die Wartung, da diese Baugruppe jederzeit problemlos regeneriert werden kann. Machen Sie einfach eine separate Assembly, die nicht markiert ist, und geben Sie Ihren leistungsabhängigen Code dort ein.
Ich weiß, dass das alt ist, aber ich musste vor kurzem einen C # -Code konvertieren, der unkontrolliert verwendet wurde, und ich dachte, ich würde teilen, wie ich es gemacht habe. Es ist reiner VB-Code und kann beliebig skaliert werden (anstatt einer projektweiten Option).
Der Trick besteht darin, eine Struktur zu erstellen, die ein Long-Feld und zwei Integer-Felder enthält. Verwenden Sie dann die Attribute StructLayout und FieldOffset, um eine Vereinigung der langen und der beiden Ganzzahlen zu erstellen. Die Felder können (sollten) privat sein. Verwenden Sie zum Erweitern von CType-Operatoren die Konvertierung von Long in die Struktur und von der Struktur in Integer (unter Verwendung des niedrigen Integer-Werts). Fügen Sie Operatorüberladungen für +, -, * usw. hinzu ... und presto! ungeprüfte Arithmetik in VB!
Sort ... es wird immer noch überlaufen, wie Strilanc darauf hingewiesen hat, wenn der Long-Wert für Longs außerhalb des Bereichs liegt. Aber es funktioniert ziemlich gut für viele Situationen, in denen nicht geprüft wird.
Hier ist ein Beispiel:
%Vor%Verwenden Sie die Struktur im Code wie folgt:
%Vor%Achten Sie darauf, dass Ihre Berechnungen nicht überlaufen, bevor Sie das Ergebnis einem UncheckedInteger zuweisen. Sie können UncheckedShort- und UncheckedByte-Strukturen mit derselben Technik erstellen.