Bloatware竞赛:产生100多个MiB可执行文件[关闭]


22

用您喜欢的编译语言创建简短的源代码,然后将其编译成较大的(不少于104857600字节)可执行文件。该程序必须是可运行的(假设有1GB的可用内存),并且可以执行任何操作(最好是简单的操作,例如hello world)。

鼓励使用非显而易见的技巧。

C中的无聊示例:

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

int main(){}

如果可以“解释”为什么无法减小可执行文件的大小(例如,实际上以某种方式使用了所有膨胀),则加分了。


7
静态链接所有库!
marinus 2013年

这就是为什么最初考虑10+ MiB,但后来又修改为100 + ...的原因。或者这意味着系统中的所有库?
六。

HTML文件可以视为可执行文件吗?
xem 2013年

ly
六。

如果将获胜标准更改为“最大输出文件”或其他内容,这可能会成为话题,但这会使当前答案无效,并使之成为至少一项其他挑战的重复。请参阅“人气竞赛”标签的状态

Answers:


13

好,这是C语言中的另一个,用于模糊定义的奖励积分:

#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将尝试调整选项,以查看是否可以通过某种方式对其进行编译。
Ilmari Karonen


也不能使用clang(ICE)和构建tcc
六。

1
关闭所有优化(-O0)以最小化对编译器的需求,启用管道(-pipe)可能会或可能不会有帮助。
dmckee 2013年

3
该编译问题使人
Christian Semrau 2013年

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(本机图像生成器)再次编译它,它变成了惊人的104MiB!

由于CLR通用类型系统是如何工作的,因此可以工作。上面的代码中的每个List <>都会生成一个新的类型声明(通常通过JIT编译,但是Ngen执行AOT编译)。因此,List <int>的一种类型,List <List <int>的另一种类型,依此类推。因此,对于此代码,将创建总共5160个不同的通用列表。


1
您需要的是一个可以编写程序的脚本。
hildred

减小程序的大小(通过删除List的嵌套级别)相当简单。可以做到这样就可以在不影响程序功能的情况下轻松删除重复的代码吗?
六。

当然,您可以只删除嵌套,但是同样,在C示例中,您只可以删除一些#defines并使程序更小。我解释不能缩小尺寸的要求的方式是无法对其进行优化。如果只允许您修改源代码,我不太明白这一点。:)
Christian Palmstierna

1
尽管应该指出,这可能可以被优化掉,因为从不使用变量a。
Christian Palmstierna 2013年

4

科宝

   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 
       . 

一点知识可能是一件危险的事情。

进行一个大型比较比进行许多小型比较会更快。IBM的Enterprise COBOL(最高4.2版)的最大工作存储量为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上,因此速度甚至更慢。

如果不重写程序就无法删除Bloat。尽管有一种有用的技术,但是大多数代码都是不好的。

这不是一个真实的例子,但是我可以想象有人这样做,如果有人足够聪明的话:-)

编译完全没有问题。快速运行它被证明是不值得尝试的。

当然,也有一个普通的旧Bug。在“搜索”任务中非常常见的一种。



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如果不首先崩溃,它将创建10 ^ 8((由10个类型组成)^(类上的8个类型参数))类文件,每个300-500字节。


这可以通过说性能很重要来解释,特别是如果类实际上做了比打印方法更多的事情时。使用通用的专用方法,而不是将其全部放入声明中,这也将使得更难以注意到


我需要构建哪个scala版本?2.9.2 + dfsg-1不喜欢s“ whatever”,也不了解scala.Specializable。
六。

Scala 2.10包含带有s“”的插值字符串,但是您可以删除该字符串而不会影响大小。Scala 2.8具有特殊化功能,因此,如果删除插值字符串,则一切正常。
user60561 2013年

-2

Java脚本

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

在此页面的浏览器控制台中运行此代码,完成后,保存页面。它应导致文件大小大于100 MB。仍在测试中。完成后将发布实际大小。

更新-
保存的页面是结果可执行文件。chrome的v8引擎是编译器。我发布的代码就是程序。我承认编译确实需要很长时间。:D


1
不能按要求工作。任务是创建一个太大的可执行文件,而不是在运行时消耗太多内存的可执行文件。另外,过度使用jQuery。
约翰·德沃夏克

@JanDvorak将创建一个大小大于100MB的HTML文件。此外,Question还没有指定任何JQuery使用限制。该程序仍在我的Chrome上执行,并且该页面正在占用300mb的内存(由Chrome任务管理器报告)。
rahulroy9202 2014年

不会的 您所做的每个追加操作都仅在内存中发生。如果用户触发保存操作,它将仅创建100MB的HTML文件。他可能无法做,也不想做。同样,即使您称此为追加“编译”的过程并且设法将结果HTML存储为文件,我也不认为您被允许编写自己的编译器。
约翰·德沃夏克

@JanDvorak我在回答中指出必须保存该页面。在这里,页面是结果可执行文件。chrome的v8引擎是编译器。我发布的代码就是程序。
rahulroy9202 2014年

2
V8是产生一个微小的“可执行”(从未它获取到硬盘驱动器),并执行它,编译,然后继续上产生了巨大的“源文件”(在语言,甚至没有编制,也没有编程语言)。如果您将脚本的结果称为可执行文件(不是...),那么我们必须将脚本称为编译器,而不是V8。如果您的脚本在执行过程中被执行,则此操作不称为编译(宏有点模糊那行,但这不是宏)
John Dvorak
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.