Erstellen Sie kurzen Quellcode in Ihrer bevorzugten kompilierten Sprache, der in eine große (nicht weniger als 104857600 Byte) ausführbare Datei kompiliert wird. Das Programm muss ausführbar sein (1 GB freier Speicher vorausgesetzt) und kann alles (vorzugsweise etwas Einfaches wie eine Hallo-Welt).
Die Verwendung nicht offensichtlicher Tricks wird empfohlen.
Langweiliges Beispiel in C:
int a[1024*1024*25] = { 1 };
int main(){}
Bonuspunkte, wenn "erklärt" werden kann, warum die ausführbare Datei nicht verkleinert werden kann (dh alles Aufblähen wird tatsächlich auf irgendeine Weise verwendet).
Antworten:
OK, hier ist noch eine in C, die die vage definierten Bonuspunkte anstrebt:
Grundsätzlich wird zur Kompilierungszeit eine aufsteigende Folge von Ganzzahlen von 0 bis 2 25 - 1 erstellt. Zur Laufzeit wird überprüft, ob die Folge tatsächlich die erwarteten Werte enthält, und wenn nicht, wird ein Fehlercode ungleich Null zurückgegeben.
Ps. Wenn ich richtig rechnete, sollte die ausführbare Datei über 100 MB groß sein. Ich werde Ihnen die genaue Größe mitteilen, sobald die Kompilierung abgeschlossen ist ...
quelle
virtual memory exhausted: Cannot allocate memory
. o_O Versucht, die Optionen zu optimieren, um zu sehen, ob ich sie irgendwie kompilieren kann.clang
(ICE) und bauentcc
.-O0
), um die Anforderungen an den Compiler zu minimieren, und aktivieren Sie-pipe
ggf. Pipes ( ).C #
Ich bin mir nicht sicher, ob dies als kurz qualifiziert ist, da der Quellcode> 30k war :)
Dh - zu groß um zu zitieren. Hier ist eine etwas verkürzte Version davon
Den Code, den ich kompiliert habe, finden Sie hier: http://pastebin.com/R5T3e3J0
Dadurch wird eine EXE-Datei mit ~ 45 KB erstellt, wenn sie ohne Optimierungen kompiliert wird. Kompiliere es erneut mit Ngen.exe (Native Image Generator) und es werden satte 104MiB!
Dies funktioniert aufgrund der Funktionsweise des generischen CLR-Typsystems. Jede Liste <> im obigen Code generiert eine neue Typdeklaration (normalerweise durch JIT-Kompilierung, aber Ngen führt eine AOT-Kompilierung durch). Also ein Typ für List <int>, ein anderer für List <List <int> und so weiter. Für diesen Code werden also insgesamt 5160 verschiedene generische Listen erstellt.
quelle
COBOL
Ein bisschen Wissen kann gefährlich sein.
Es kann schneller sein, einen großen Vergleich durchzuführen als viele kleine Vergleiche. IBMs Enterprise COBOL (bis Version 4.2) kann einen maximalen ARBEITS-STORAGE von 128 MB haben (Version 5.0 kann 2 GB haben); LOCAL-STORAGE bietet weitere 128 MB, wenn Sie mehr Speicherplatz benötigen.
Die Aufgabe besteht darin, zu bestätigen, dass ein 11584-Byte-Speicher den Wert "HELLO WORLD!" Irgendwo und der Rest ist Platz.
Der fiktive Programmierer beschließt, ein Unterprogramm dafür zu schreiben (nur für den Fall, dass es woanders benötigt wird) und seine Hochleistungstechnik einzubeziehen (Bonus).
Der Programmierer berechnet, dass 11584 * 11584 128 MB groß ist, verwendet also WORKING-STORAGE für eine große Tabelle und LOCAL-STORAGE für alles andere, was benötigt wird.
Der Programmierer verschlüsselt es und lächelt wissentlich, wenn die Kompilierung sauber ist. Sie hatten Recht mit den 128MB.
Testet den Code. Es klappt. Möglicherweise etwas langsam, aber die Maschine ist stark belastet. Lächelt wieder und denkt darüber nach, wie langsam es wäre, wenn sie ohne ihr Expertenwissen codiert würden.
Der WORKING-STORAGE kommt auf 134.189.056 Bytes und es gibt auch ein paar Bytes von anderen Sachen. Sollte groß genug sein.
Die Realität ist, dass ein langer Vergleich anstelle eines kurzen Vergleichs, wie hier implementiert, ein sehr langsamer Weg ist, dies zu tun.
Noch langsamer bewirkt der LOCAL-STORAGE, der bei jedem Aufruf eines Unterprogramms durch Laufzeitroutinen initialisiert wird, dass für jeden CALL die gesamten 128MB eingerichtet werden.
Der Programmierer hat sich in Bezug auf die Größe des Tisches einfach geirrt, es ist genügend Platz vorhanden, ohne LOCAL-STORAGE zu verwenden. Lange Vergleiche können kurze Vergleiche schlagen, aber nur, wenn die tatsächliche Anzahl der Vergleiche verringert wird.
Ich habe darüber nachgedacht, das LOKALE LAGER und das ARBEITSLAGER zu vertauschen. Es ist nur weitaus unwahrscheinlicher, dass jemand es so codiert, also habe ich es nicht getan. Wenn Sie einen VALUE-SPACE-Wert auf den Tisch legen (wenn er sich in LOCAL-STORAGE befunden hätte), würde der Tisch bei jedem CALL zweimal initialisiert , also noch langsamer.
Das Aufblähen kann nicht entfernt werden, ohne das Programm neu zu schreiben. Der meiste Code ist schlecht, obwohl es eine nützliche Technik gibt.
Dies ist kein reales Beispiel, aber ich kann mir vorstellen, dass jemand es tut, wenn dieser jemand klug genug ist :-)
Kompilieren ist überhaupt kein Problem. Es erweist sich schnell als nicht wert, es mit jeder Möglichkeit zu versuchen.
Natürlich gibt es auch einen einfachen alten Bug. Sehr häufig bei der Suche nach Aufgaben.
quelle
PowerBASIC
quelle
Scala
Die spezialisierte Annotation erstellt für jeden Typ eine neue Klasse, um ein Boxen zu verhindern, wenn die Typen schließlich alle zu Objekten werden. Es werden 10 ^ 8 ((
Everything
besteht aus 10 Typen) ^ (8 Typparameter für die Klasse)) Klassendateien mit jeweils 300-500 Byte erstellt, wenn es nicht zuerst abstürzt.Dies lässt sich damit erklären, dass die Leistung wichtig ist, insbesondere wenn die Klasse tatsächlich mehr als nur eine Druckmethode hat. Die Verwendung allgemeiner spezialisierter Methoden, anstatt alles in die Erklärung aufzunehmen, würde es auch schwieriger machen, dies zu bemerken
quelle
Javascript
Führen Sie diesen Code in der Browserkonsole auf dieser Seite aus und speichern Sie die Seite, wenn Sie fertig sind. es sollte zu einer Dateigröße von mehr als 100 MB führen. Testen noch. Sendet die tatsächliche Größe, sobald dies erledigt ist.
update -
die gespeicherte Seite ist das ausführbare Ergebnis. Die v8-Engine von Chrome ist der Compiler. Und der Code, den ich gepostet habe, ist das Programm. ich gebe zu, dass das kompilieren ziemlich lange dauert. : D
quelle