那些只有几行,但是却非常牛逼的代码!

本文介绍了一系列令人惊奇的代码和算法,包括无需编写代码即可运行的nocode项目、洗牌算法、睡眠排序、AI核心代码、获取第二天时间的代码、0x5f375a86的神奇数字以及经典的HelloWorld程序。

原文地址:https://www.toutiao.com/i6800262027450253836/


1、no code

项目地址:

https://github.com/kelseyhightower/nocode

这是一个 GitHub 上的项目,目前标星 34k。

它的牛逼之处在于它 基于轻量级跨平台全自动不可描述工具,采用了不可描述的高级语言语法,不用写一行代码,即可部署运行,提供检测、编译、打包、安装、运行一条龙服务,安全可靠。

看完代码后,国内外的程序员纷纷留言夸奖。

真的是阅尽天下代码,心中已然无码!

2、洗牌算法

这个代码很简单,只有两行代码,但是却可以实现这个功能:对于给定的 n 个元素,生成的那个排列,每一个元素都能等概率地出现在每一个位置。

换句话说,每一个位置都能等概率地放置每个元素。

代码如下(JDK中Collections.shuffle()也是这样实现的):

for(int i = n - 1; i >= 0 ; i -- )
    // rand(0, i) 生成 [0, i] 之间的随机整数
    swap(arr[i], arr[rand(0, i)]) 


3、睡眠排序

代码如下:

public class SleepSort {  
    public static void main(String[] args) {  
        int[] ints = {1,4,7,3,8,9,2,6,5};  
        SortThread[] sortThreads = new SortThread[ints.length];  
        for (int i = 0; i < sortThreads.length; i++) {  
            sortThreads[i] = new SortThread(ints[i]);  
        }  
        for (int i = 0; i < sortThreads.length; i++) {  
            sortThreads[i].start();  
        }  
    }  
}  
class SortThread extends Thread{  
    int ms = 0;  
    public SortThread(int ms){  
        this.ms = ms;  
    }  
    public void run(){  
        try {  
            sleep(ms*10+10);  
        } catch (InterruptedException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
        System.out.println(ms);  
    }  
}  

它原理是构造 n 个线程,它们和这 n 个数一一对应。

初始化后,线程们开始睡眠,等到对应的数那么多个时间单位后各自醒来,然后输出它对应的数。

这样最小的数对应的线程最早醒来,这个数最早被输出。

等所有线程都醒来,排序就结束了。

不要问时间复杂度,时间复杂度在这个排序上已经毫无意义!

4、AI核心代码

while True:
    print(input('').replace('吗','').replace('?','!'))

这段代码就是传说中的 价值一个亿的AI核心代码,来看一下效果。

5、获取第二天时间

代码如下:

// 人才人才
thread.sleep(86400*1000L);

5、0x5f375a86

这个数字有多神奇?你可以自己百度一下!

这个数字是某引擎的源代码里包括的一个反平方倒数的算法,其速度要比标准的牛顿迭代法快上 4 倍,而其中的关键是一行神秘的代码和一个莫名其妙的数字:[ i = 0x5f3759df - ( i >> 1 ); // what the fuck? ] 。代码如下:

没有人知道Carmack是怎么发现这个数字的。普度大学的数学家Lomont觉得很好玩,决定要研究一下卡马克弄出来的这个猜测值有什么奥秘。Lomont也是个牛人,在精心研究之后从理论上也推导出一个最佳猜测值,和卡马克的数字非常接近, 0x5f37642f。卡马克真牛,他是外星人吗?

传奇并没有在这里结束。Lomont计算出结果以后非常满意,于是拿自己计算出的起始值和卡马克的神秘数字做比赛,看看谁的数字能够更快更精确的求得平方根。结果是卡马克赢了... 谁也不知道卡马克是怎么找到这个数字的。最后Lomont怒了,采用暴力方法一个数字一个数字试过来,终于找到一个比卡马克数字要好上那么一丁点的数字,虽然实际上这两个数字所产生的结果非常近似,这个暴力得出的数字是0x5f375a86

Lomont为此写下一篇论文,"Fast Inverse Square Root"。

6、hello world

嗯,这个一定要写上。不管你学的是什么语言,都肯定写过hello world的!

------end------

<think>好的,我现在要解决用户提出的问题:几行代码编译特别慢的原因及解决方案。首先,我需要回忆编译过程的基本知识,了解可能导致编译速度慢的常见因素。然后结合用户提供的引用内容,看看是否有相关的信息可以利用。虽然用户给出的引用主要涉及慢查询、AndroidManifest报错、按需加载组件和SimpleCV库,但可能其中某些思路可以借鉴,比如按需加载减少资源消耗,或者分析具体配置参数。不过编译速度的问题更多与编译器设置、代码结构、依赖管理相关,需要具体分析。 首先,可能的原因包括: 1. **头文件包含过多或递归包含**:如果代码中有大量不必要的头文件,或者头文件之间有复杂的依赖关系,导致预处理阶段耗时增加。 2. **模板元编程或复杂宏展开**:C++中的模板元编程可能会在编译时生成大量代码,增加编译时间。 3. **编译器优化选项过高**:比如使用-O3或更高的优化级别,编译器进行深度优化会增加编译时间。 4. **代码结构不合理**:比如单个文件过大,或者频繁修改头文件导致依赖该头文件的所有文件都需要重新编译。 5. **缺少增量编译**:每次编译都重新编译整个项目,而没有利用之前的编译结果。 6. **硬件资源不足**:内存不足或CPU性能较低,导致编译速度慢。 接下来,解决方案可能包括: - **检查头文件依赖**:使用工具分析头文件包含,移除不必要的包含,使用前置声明减少依赖。 - **使用预编译头文件(PCH)**:将常用的头文件预编译,减少重复处理时间。 - **优化编译器选项**:调整优化级别,如开发阶段使用-O0或-O1,发布时再使用更高优化。 - **并行编译**:使用多线程编译,如make -j或ninja。 - **启用增量编译**:确保构建系统支持只编译改动过的部分。 - **升级硬件或使用分布式编译**:增加内存,使用SSD,或使用像ccache这样的缓存工具,或者分布式编译工具如distcc。 需要验证这些思路是否正确,比如检查是否有相关的编译器选项设置,或者代码中是否存在大量模板实例化。同时,参考用户提供的引用中提到的按需加载思想,可能类比到代码中的模块化设计,减少不必要的编译单元。 例如,引用[3]提到按需引入组件,类似地,代码中可以减少头文件的包含,只引入必要的部分。另外,引用[1]中设置long_query_time来记录慢查询,可能类比于设置编译器的verbose或time参数来分析编译耗时步骤。 接下来需要将这些思路结构化,分点说明原因和解决方案,并确保符合用户要求的格式,比如行内数学公式用$...$,独立公式用$$...$$。不过当前问题可能不涉及数学公式,所以可能不需要使用。但需注意LaTeX的正确使用。 最后,生成相关问题,确保问题与编译速度相关,并引导用户进一步探讨。</think>### 几行代码编译特别慢的原因及解决方案 #### 一、常见原因分析 1. **头文件依赖复杂** 包含过多冗余头文件或头文件之间存在循环依赖,导致预处理阶段耗时过长[^1]。例如,若头文件`A.h`包含`B.h`,而`B.h`又包含`A.h`,可能引发递归展开。 2. **模板元编程或宏展开复杂** C++模板元编程或大量嵌套宏会导致编译器生成大量中间代码,显著增加编译时间。例如: ```cpp template<typename T> class ComplexTemplate { /* 多层嵌套模板逻辑 */ }; ``` 3. **编译器优化级别过高** 开启高级优化选项(如`-O3`)会迫使编译器执行深度分析和代码优化,延长编译时间。 4. **代码结构问题** - 单文件代码量过大(如数千行)。 - 频繁修改被广泛引用的头文件,触发全项目重新编译。 5. **编译环境配置不当** - 未启用并行编译(如`make -j`)。 - 未使用增量编译工具(如`ccache`)。 6. **硬件性能瓶颈** 内存不足或CPU性能较低时,编译效率会显著下降。 --- #### 二、解决方案 1. **优化头文件依赖** - 使用前置声明代替包含头文件: ```cpp class MyClass; // 前置声明 void process(MyClass* obj); // 避免包含完整头文件 ``` - 通过工具(如`include-what-you-use`)分析冗余头文件。 2. **减少模板实例化开销** - 显式实例化高频使用的模板类型: ```cpp template class std::vector<int>; // 显式实例化 ``` 3. **调整编译器选项** - 开发阶段使用`-O0`或`-O1`优化级别,发布时再切换为`-O3`。 - 启用预编译头文件(PCH): ```bash g++ -xc++-header stdafx.hpp -o stdafx.hpp.gch ``` 4. **改进编译流程** - 使用并行编译: ```bash make -j8 # 根据CPU核心数调整线程数 ``` - 配置`ccache`缓存编译结果: ```bash export CCACHE_DIR=/path/to/cache ``` 5. **代码结构优化** - 拆分大文件为多个小模块。 - 使用`Pimpl`模式隐藏实现细节,减少头文件变动影响范围: ```cpp // MyClass.h class MyClass { private: class Impl; Impl* impl; }; ``` 6. **升级硬件或使用分布式编译** - 增加内存容量(建议≥16GB)。 - 使用`distcc`进行分布式编译,利用多台机器资源。 --- #### 三、性能分析工具 - **生成编译耗时报告** Clang可通过`-ftime-trace`生成JSON格式的编译时间分析文件,用Chrome的`chrome://tracing`工具可视化。 - **GCC耗时分析** 使用`-ftime-report`选项输出各阶段耗时统计。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值