ブロートウェアコンテスト:100個以上のMiB実行可能ファイルの作成[終了]


22

大きな(104857600バイト以上)実行可能ファイルにコンパイルする、お気に入りのコンパイル言語で短いソースコードを作成します。プログラムは実行可能でなければならず(1GBの空きメモリを想定)、何でもできます(hello worldのような単純なものが望ましい)。

非自明なトリックの使用が推奨されます。

Cでの退屈な例:

int a[1024*1024*25] = { 1 };

int main(){}

ボーナスは、実行可能ファイルのサイズを小さくできない理由を「説明」できる場合(つまり、すべての膨張が実際に何らかの形で使用される場合)にポイントします。


7
すべてのライブラリを静的にリンクします!
マリヌス

それが、当初10+ MiBについて考えていたが、100 +に改訂された理由です...または、システム内のすべてのライブラリを意味しますか?
Vi。

HTMLファイルを実行可能ファイルと見なすことはできますか?
xem

Unlikely.󠀠󠀠󠀠
Viに。

勝利基準が「最大の出力ファイル」などに変更された場合、これは話題にとどまる可能性がありますが、現在の回答が無効になり、少なくとも1つの他の課題の複製になります。参照してください人気コンテストタグの状態

回答:


13

OK、Cにもう1つあります。漠然と定義されたボーナスポイントです。

#define a(x) x,x|1,x|2,x|3,x|4,x|5,x|6,x|7
#define b(x) a(x),a(x|8),a(x|16),a(x|24)
#define c(x) b(x),b(x|32),b(x|64),b(x|96)
#define d(x) c(x),c(x|128),c(x|256),c(x|384)
#define e(x) d(x),d(x|512),d(x|4<<8),d(x|6<<8)
#define f(x) e(x),e(x|2048),e(x|4096),e(x|6144)
#define g(x) f(x),f(x|8192),f(x|4<<12),f(x|6<<12)
#define h(x) g(x),g(x|2<<14),g(x|4<<14),g(x|6<<14)
#define i(x) h(x),h(x|2<<16),h(x|4<<16),h(x|6<<16)
#define j(x) i(x),i(x|2<<18),i(x|4<<18),i(x|6<<18)
#define k(x) j(x),j(x|2<<20),j(x|4<<20),j(x|6<<20)
int u,v,z[]={k(0),k(2<<22),k(4<<22),k(6<<22)}
int main(){for(u=v=0;u<1<<25;u++)v|=u!=z[u];return v;}

基本的には、コンパイル時に、それは0から2の整数の昇順を構築する25 - 1.実行時に、それは順序が実際に期待値が含まれていることを確認し、ない場合は、ゼロ以外のエラーコードを返します。

追伸 正しく計算した場合、実行可能ファイルは100 MiBを超えるはずです。コンパイルが完了したら、正確なサイズをお知らせします...


1
追伸 実際のサイズを確認しようとする試みは、(できれば一時的に)かなり珍しいGCCエラーメッセージと思われるものによって妨害されました:virtual memory exhausted: Cannot allocate memory。o_Oオプションを微調整して、どうにかコンパイルできるかどうかを確認します。
イルマリカロネン


また、clang(ICE)およびでビルドできませんtcc
Vi。

1
すべての最適化(-O0)をオフにしてコンパイラーへの要求を最小限に抑え-pipeます。パイプを有効にする()が役立つ場合とそうでない場合があります。
dmckee

3
:問題をコンパイルすると、プログラムが正しいことを確認するために彼自身のプリプロセッサを書くIOCCCの受賞エントリを連想させることioccc.org/2004/vik2.hint
クリスチャンSemrau

6

C#

ソースコードが30kを超えたため、これが短いとみなされるかどうかはわかりません:)

つまり、引用するには大きすぎます。これを少し短くしたバージョンです

using System.Collections.Generic;
class Program
{
    static void Main()
    {
        var a = new List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<int>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>();
    }
}

実際にコンパイルしたコードは、http//pastebin.com/R5T3e3J0にあります。

これにより、最適化せずにコンパイルすると、〜45KiBの.EXEファイルが作成されます。Ngen.exe(Native Image Generator)で再度コンパイルすると、なんと104MiBになります!

これは、CLRジェネリック型システムの仕組みが原因で機能します。上記のコードのすべてのList <>は、新しい型宣言を生成します(通常はJITコンパイルを使用しますが、NgenはAOTコンパイルを実行します)。したがって、1つのタイプはList <int>に、もう1つのタイプはList <List <int>>などになります。したがって、このコードでは、合計5160の異なるジェネリックリストが作成されます。


1
必要なのは、プログラムを作成するスクリプトです。
hildred

プログラムのサイズを小さくするのはかなり簡単です(リストのネストレベルを削除することにより)。プログラムの機能に影響を与えずに繰り返しコードを簡単に削除できないようにできますか?
Vi。

もちろん、ネストを削除することもできますが、同様に、Cの例では、いくつかの#definesを削除してプログラムを小さくすることができます。サイズを縮小できないという要件を解釈する方法は、最適化を排除できないことでした。ソースコードを変更することだけが許可されている場合、そのポイントはわかりません。:)
クリスチャンパームスティアナ

1
ただし、変数aは使用されないため、これはおそらく最適化されて削除される可能性があることに注意してください。
クリスチャンパームスティアナ

4

COBOL

   ID DIVISION. 
   PROGRAM-ID. BLOAT. 
   ENVIRONMENT DIVISION. 
   DATA DIVISION. 
   WORKING-STORAGE SECTION. 
   01  THE-TEST-STRINGS. 
       05  FILLER OCCURS 11584 TIMES. 
           10  TEST-STRING          PIC X(11584). 
   LOCAL-STORAGE SECTION. 
   01  FIRST-TIME-FLAG              PIC X VALUE "Y". 
   01  DISP-BEFORE-STRING     COMP  PIC 9(8). 
   01  LOOP-COUNTER           COMP  PIC 9(8). 
   01  START-STRING. 
       05  FILLER OCCURS 0 TO 11584 TIMES 
           DEPENDING ON DISP-BEFORE-STRING. 
           10  FILLER               PIC X. 
       05  THE-SUBSTRING            PIC X(12). 
   01  INITIAL-STRING               PIC X(12) 
                                     VALUE "HELLO WORLD!".
   LINKAGE SECTION. 
   01  STRING-PARAMETER             PIC X(11584). 
   01  THE-RESULT                   PIC X. 
   PROCEDURE DIVISION USING 
                                    STRING-PARAMETER 
                                    THE-RESULT 
                                    . 

       IF FIRST-TIME-FLAG = "Y" 
           PERFORM                  SET-UP-STRINGS 
       END-IF 
       PERFORM 
         VARYING                    LOOP-COUNTER 
         FROM                       1 
           BY                       1 
         UNTIL                      LOOP-COUNTER 
           GREATER THAN 11584 
         OR STRING-PARAMETER 
             EQUAL TO               TEST-STRING 
                                        ( LOOP-COUNTER ) 
       END-PERFORM 
       IF STRING-PARAMETER 
         EQUAL TO TEST-STRING ( LOOP-COUNTER ) 
           MOVE "Y"                TO THE-RESULT 
       ELSE 
           MOVE "N"                TO THE-RESULT 
       END-IF 
       GOBACK 
       . 
   SET-UP-STRINGS. 
       PERFORM 
         VARYING                    LOOP-COUNTER 
         FROM                       0 
           BY                       1 
         UNTIL                      LOOP-COUNTER 
           EQUAL TO 11584 
           MOVE 11584               TO DISP-BEFORE-STRING 
           MOVE SPACE               TO START-STRING 
           MOVE LOOP-COUNTER        TO DISP-BEFORE-STRING 
           MOVE INITIAL-STRING      TO THE-SUBSTRING 
           MOVE START-STRING        TO TEST-STRING 
                                        ( LOOP-COUNTER + 1 )
       END-PERFORM 
       MOVE "N"                     TO FIRST-TIME-FLAG 
       . 

少しの知識は危険なことです。

多くの小さな比較よりも、1つの大きな比較を行う方が高速です。IBMのEnterprise COBOL(バージョン4.2まで)は、最大WORKING-STORAGEを128MB(バージョン5.0は2GB)にすることができます。LOCAL-STORAGEは、さらにスペースが必要な場合にさらに128MBを提供します。

タスクは、11584バイトのストレージの値が「HELLO WORLD!」であることを確認することです どこかに、残りはスペースです。

架空のプログラマーは、このためのサブプログラムを作成し(他の場所で必要な場合に備えて)、その高性能な手法(ボーナス)を含めることにしました。

プログラマーは、11584 * 11584は128MBであると計算します。したがって、巨大なテーブルにはWORKING-STORAGEを使用し、その他の必要なものにはLOCAL-STORAGEを使用します。

プログラマーはそれをコーディングし、コンパイルがクリーンになったときに自分自身に故意に微笑みます。彼らは128MBについては正しかった。

コードをテストします。できます。少し遅いかもしれませんが、マシンに重い負荷がかかっています。再び微笑んで、自分の専門知識のレベルなしでコーディングするとどれだけ遅いかを考えます。

WORKING-STORAGEのサイズは134,189,056バイトで、他にも数バイトがあります。十分な大きさでなければなりません。

現実には、ここで実装されているように、短い比較の代わりに長い比較を行うことは、非常に遅い方法です。

さらに遅いのは、サブプログラムが呼び出されるたびにランタイムルーチンによって初期化されるLOCAL-STORAGEにより、CALLごとに128MB全体が設定されることです。

プログラマーはテーブルのサイズについて明らかに間違っていました。LOCAL-STORAGEを使用しなくても十分なスペースがあります。長い比較は短い比較を上回ることができますが、実際の比較の数が減った場合のみです。

LOCAL-STORAGEとWORKING-STORAGEを入れ替えることを検討しました。誰かがそのようにコーディングする可能性ははるかに低いので、私はしませんでした。テーブルにVALUE SPACEを配置すると(LOCAL-STORAGEにあった場合)、各CALLでテーブルが2回初期化されるため、さらに遅くなります。

プログラムを書き換えずに、Bloatを削除することはできません。有用なテクニックが1つありますが、ほとんどのコードは不良です。

これは実際の例ではありませんが、誰かが十分に賢いのであれば、誰かがそれをやっていると想像できます:-)

コンパイルはまったく問題ありません。あらゆる可能性でそれを実行すると、すぐに試してみる価値がないことがわかります。

もちろん、単純な古いバグもあります。「検索」タスクで非常に一般的なもの。



0

スカラ

import scala.{specialized=>s}
import scala.Specializable.{Everything=>E}
class Printer[@s(E) A, @s(E) B, @s(E) C, @s(E) D, @s(E) E, @s(E) F, @s(E) G, @s(E) H]{
    def print(a:A,b:B,c:C)=println(s"$a, $b, $c")
}

object Main extends App{ 
    (new Printer[Int,Int,Int,Int,Int,Int,Int,Int]).print(1,2,3)
}

特殊な注釈は、タイプが最終的にすべてオブジェクトになったときにボックス化されるのを防ぐために、タイプごとに新しいクラスを作成します。Everything最初にクラッシュしない場合、それぞれ300〜500バイトのクラスファイルを10 ^ 8((10個のタイプで構成)^(クラス上の8つのタイプパラメータ))クラスファイルを作成します。


これは、パフォーマンスが重要であると言うことで説明できます。特に、クラスが実際に印刷するメソッドを持っている以上の場合はそうです。宣言にすべてを入れるのではなく、汎用の特殊メソッドを使用すると、気づきにくくなります


これをビルドするにはどのscalaバージョンが必要ですか?2.9.2 + dfsg-1はs "whatever"が好きではなく、scala.Specializableについても知りません。
Vi。

Scala 2.10にはs ""で補間された文字列が含まれていますが、サイズに影響を与えずにその文字列を削除できます。Scala 2.8には特殊化機能があるため、補間された文字列を削除すると、すべてが正常に機能します。
user60561

-2

Javascript

function bigenough(){
        var kbytes = $('html').html().length;
        return (kbytes>1024*100);
}
while(!bigenough()){
$('html').append('<p>WASSUP</p>');}

このページのブラウザコンソールでこのコードを実行し、完了したらページを保存します。その結果、ファイルサイズは100 MBを超えるはずです。まだテスト中。一度行われた実際のサイズを掲載します。

update-
保存されたページは結果の実行可能ファイルです。chromeのv8エンジンはコンパイラーです。そして、私が投稿したコードはプログラムです。コンパイルに時間がかかることは認めます。:D


1
必要に応じて機能しません。タスクは、実行時にメモリを大量に消費するものではなく、大きすぎる実行可能ファイルを作成することです。また、jQueryの過剰使用。
ジョンドヴォルザーク14

@JanDvorakは、サイズが100MBを超えるHTMLファイルを作成します。また、質問では、JQueryの使用制限は指定されていません。プログラムはまだChromeで実行されており、Chromeタスクマネージャーから報告されたとおり、ページで300 MBのメモリを消費しています。
rahulroy9202 14

しません。あなたが行うすべての追加は、純粋にメモリ内で行われます。ユーザーが保存操作をトリガーした場合にのみ、100MBのHTMLファイルが作成されます。彼はできないかもしれないし、したくないかもしれない。また、あなたは「コンパイル」を追加するこのプロセスを呼び出す場合でも、あなたはファイルとして結果のHTMLを保存するために管理し、私はあなたがあなた自身のコンパイラを書くことが許されているとは思いません。
ジョンドヴォルザーク14

@JanDvorak私は答えで、ページを保存しなければならないことを指摘しました。ここでは、ページは結果の実行可能ファイルです。chromeのv8エンジンはコンパイラーです。そして、私が投稿したコードはプログラムです。
rahulroy9202 14

2
V8は、小さな「実行可能ファイル」(ハードドライブに格納されない)を生成して実行するコンパイラーですその後、巨大な「ソースファイル」を生成します(コンパイルされていない言語でも、プログラミング言語)。場合は、あなたのスクリプトの実行の結果を呼び出す(いや...)我々は呼び出す必要がありますスクリプトをコンパイラではなく、V8。スクリプトがプロセスで実行された場合、コンパイルと呼ばれません(マクロはその行を少しぼかしますが、これはマクロではありません)
ジョンドヴォルザーク14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.