- 入睡时的咖啡因代谢剩余应当低于20mg
- 咖啡因的代谢半衰期约为6.
- 50mg的红牛在中午12点摄入, 那么在晚上12点后剩余约为12.5mg
- 150mg的咖啡在中午12点摄入, 那么在晚上12点后剩余约为37.5, 即使能入睡也会影响到睡眠
- 低因咖啡的含量约为10~20mg
- 入睡前4个小时内不能有剧烈活动, 力量训练 短跑等.
detour_crowd-path_corridor
OI卡常优化
gcc-3.4.6为参考
O0
不做任何优化, 这是默认的编译选项.
O1
-O和-O1: 对程序做部分编译优化, 对于大函数,优化编译占用稍微多的时间和相当大的内存. 使用本项优化, 编译器会尝试减小生成代码的尺寸, 以及缩短执行时间, 但并不执行需要占用大量编译时间的优化.
fdefer-pop: 延迟栈的弹出时间. 当完成一个函数调用, 参数并不马上从栈中弹出, 而是在多个函数被调用后, 一次性弹出.
fmerge-constants: 尝试横跨编译单元合并同样的常量(string constants and floating point constants)
fthread-jumps: 如果某个跳转分支的目的地存在另一个条件比较,而且该条件比较包含在前一个比较语句之内,那么执行本项优化.根据条件是true或者false,前面那条分支重定向到第二条分支的目的地或者紧跟在第二条分支后面.
floop-optimize: 执行循环优化,将常量表达式从循环中移除, 简化判断循环的条件, 并且optionally do strength-reduction, 或者将循环打开等. 在大型复杂的循环中, 这种优化比较显著.
fif-conversion: 尝试将条件跳转转换为等价的无分支型式. 优化实现方式包括条件移动, min, max, 设置标志, 以及abs指令, 以及一些算术技巧等.
fif-conversion2基本意义相同, 没有找到更多的解释.
fdelayed-branch: 这种技术试图根据指令周期时间重新安排指令. 它还试图把尽可能多的指令移动到条件分支前, 以便最充分的利用处理器的治理缓存.
fguess-branch-probability: 当没有可用的profiling feedback或__builtin_expect时, 编译器采用随机模式猜测分支被执行的可能性, 并移动对应汇编代码的位置, 这有可能导致不同的编译器会编译出迥然不同的目标代码.
fcprop-registers: 因为在函数中把寄存器分配给变量, 所以编译器执行第二次检查以便减少调度依赖性(两个段要求使用相同的寄存器)并且删除不必要的寄存器复制操作.
MEMORY OVERCOMMIT
Memory Overcommit的意思是操作系统承诺给进程的内存大小超过了实际可用的内存.
一个保守的操作系统不会允许memory overcommit, 有多少就分配多少, 再申请就没有了, 这其实有些浪费内存, 因为进程实际使用到的内存往往比申请的内存要少
比如某个进程malloc()了200MB内存, 但实际上只用到了100MB, 按照UNIX/Linux的算法, 物理内存页的分配发生在使用的瞬间, 而不是在申请的瞬间, 也就是说未用到的100MB内存根本就没有分配, 这100MB内存就闲置了
下面这个概念很重要, 是理解memory overcommit的关键: *commit(或overcommit)针对的是内存申请, 内存申请不等于内存分配, 内存只在实际用到的时候才分配. *
windows下安装WSL
环境安装
- 打开windows 功能
- 适用于linux的windows子系统
- 虚拟机平台
- 使用管理员权限打开命令行
1
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
下载wsl_update_x64.msi
WSL2 Linux kernel update package for x64 machines1
wsl --set-default-version 2
安装debian
microsoft store 选择Debian
- 设置root密码
1
sudo passwd root
secureCRT连接local shell
- file->open local shell
- 更改路径cmd.exe为bash.exe
cmake recent call 错误
1 | 1. Create file wsl.conf in /etc/ with content: |
开发环境配置
Sublime
1 | // windows下使用unix换行符 |
VS
- 选项->文本编辑器->C/C++->常规 自动换行
- 选项->文本编辑器->C/C++->制表符 插入空格
- 选项->文本编辑器->C/C++->代码样式->格式设置 关闭clangformat
VSCODE
install “Remote - WSL”
install “Markdown All in One”
install “GitHub Theme”
设置选项搜索”eol” 设置为LF
设置选项搜索”font” 设置字体 Hack, Hack, Hack
备注
CR(Carriage Return)代表回车(转义序列\r),将光标移动到当前行的开头。
LF(Line Feed)代表“换行”,但你可能更熟悉术语换行符(转义序列 \n)。 (unix)
CRLF (windows采用)
git
1 | * autocrlf: true |
find ./ -name *.h | xargs dos2unix
```
高性能编程:内存访问性能分析和常见数据结构
CPU CACHE
在计算机系统中,CPU高速缓存(英语:CPU Cache,在本文中简称缓存)是用于减少处理器访问内存所需平均时间的部件。在金字塔式存储体系中它位于自顶向下的第二层,仅次于CPU寄存器。其容量远小于内存,但速度却可以接近处理器的频率。
当处理器发出内存访问请求时,会先查看缓存内是否有请求数据。如果存在(命中),则不经访问内存直接返回该数据;如果不存在(失效),则要先把内存中的相应数据载入缓存,再将其返回处理器。
缓存之所以有效,主要是因为程序运行时对内存的访问呈现局部性(Locality)特征。这种局部性既包括空间局部性(Spatial Locality),也包括时间局部性(Temporal Locality)。有效利用这种局部性,缓存可以达到极高的命中率。
在处理器看来,缓存是一个透明部件。因此,程序员通常无法直接干预对缓存的操作。但是,确实可以根据缓存的特点对程序代码实施特定优化,从而更好地利用缓存。