0%

C++ 漫游的第一部分,起因源于项目中错误的使用 std::ref 和 std::fowrad 导致了一些神奇的 bug。而 std::ref 又涉及到了引用,左右值引用又会联想到移动语义,std::forward 又常用于模板。所以以此为契机,不如仔细学习一下 C++ 中的新特性。

2018 年计算机组成原理的大作业,五级流水不会写,三级流水写不出来。竟然没想不到多年后还会用到多级流水的思路去设计代码。

移动端算法优化是个很庞大的话题。从计算机体系到指令,涉及到非常广而深的东西。本文尝试以常见的算法为例,阐述算法在单线程场景下的加速与优化,多线程是最后的收尾,没啥可说的。而至于具体的场景,如金字塔、滤波、降噪等,优化的思路都是相同的:减少 IO,一次 IO 完成尽可能多的计算。

本文会使用 Neon, OpenCL 来优化算法,如果有可能也会引入 DSP。本文持续更新,整理算法优化相关的经验。额外的,确保打开了 O3 编译选项,打开 release 模式等,否则会影响算法的执行时间。

之前对 C 语言中宏定义的认知十分简单,包括但不限于停留在以下浅薄的层面:

1
2
#define PI 3.14
#define add(a, b) a + b

上述代码完全是大学课本中的用法。但当我看到实际项目中宏的用法后完全是一头雾水,所以自己也要写出那种高逼格让别人看不太懂的代码。宏远远比我想象的要强大,所以本文为每个宏技巧都配备了一个实用场景。

  • 字符串化操作符,实现一个简单的自动化测试样例
  • 字符串连接,实现一个具备计时功能的宏
  • X 宏,实现根据输入执行不同的函数
  • 特殊宏 __VA_ARGS__,实现一个简单的日志函数

整体的开发感受是:缺乏一个合理的、完整的软件开发流程或规范。

写在前面。希望你不会有快速搭建 UI 界面为他人服务这种迫切的需求。虽然这是我的博客,但是我并不希望你搜到他。对于完全未知的领域,快速搭建、快速学习、不会就去学、不会就查、速成,通过这种方式写出来的代码一定是不好的,心累的,事倍功半的,也一定存在多多少少的 bug 和无法实现的逻辑。

但也有一个好消息,如果你完全不会前端后端,只会 Python,看了本文也能搭建完成的前后端服务,但距离入门的全栈工程师还差很远。

没想到有一天写 python 的时候也会想着如何去节省内存。平时写 python 的时候根本不会关注这些,变量什么的直接创建和使用就完了,也不用考虑内存的释放,反正有垃圾回收机制。只不过这次数据量过大,debug 的时候发现内存一直在申请,导致系统彻底的卡死。

可能也是从事算法的优化工作养成了职业病,每次写代码的时候都会想,这些代码消耗的时间怎么样,占用的空间怎么样,数据结构是否可以继续优化,这些逻辑有没有更优雅的写法。

注:本文程序中使用 psutil 库来监测进程使用的内存大小,需要 pip install psutil一下。