Category Archives: 编程技术

桌面开发用 Tkinter/wxPython/PyQt 哪个好?

Python 有很多 GUI 框架,比如著名的 Tkinter,wxPython 和 PyQt,那么想用 Python 开发桌面软件的话选哪个更好呢?作为三个都用过的人先给个结论,不用纠结,直接选 PyQt 即可。 很多人说 Tkinter 简单无依赖,没错,但这就是 tkinter 唯一的仅存的优点了,但是请大家注意,Tkinter 的这个 “简单”,是指 “功能少和效果单一”,不是写程序简单明了,真正写起程序来还是 PyQt 最简单清晰。 有些东西你学出来就过时了,比如 “算盘”,比如 Tkinter 和 wxPython;而有的东西你学会了,即便不吃这碗饭,不靠它涨工资,也能在今后一二十年持续受益,比如练习打字速度,比如背单词,比如学习 PyQt。 对于桌面开发,天下武功那么多,PyQt 既是最正统的门派,同时又是一系列综合技术的组合,它近可以同 C++ Qt 无缝整合,解决性能相关的东西;退,又有基于 chromium 的 QtWebEngine ,能在适合跑页面的部分用 html/js 来写页面,并和 python 双向调用,实现类似 … Continue reading

Loading

Posted in 编程技术 | Tagged , | Leave a comment

定点数优化:性能成倍提升

定点数这玩意儿并不是什么新东西,早年 CPU 浮点性能不够,定点数技巧大量活跃于各类图形图像处理的热点路径中。今天 CPU 浮点上来了,但很多情况下整数仍然快于浮点,因此比如:libcario (gnome/quartz 后端)及 pixman 之类的很多库里你仍然找得到定点数的身影。那么今天我们就来看看使用定点数到底能快多少。 简单用一下的话,下面这几行宏就够了: #define cfixed_from_int(i) (((cfixed)(i)) << 16) #define cfixed_from_float(x) ((cfixed)((x) * 65536.0f)) #define cfixed_from_double(d) ((cfixed)((d) * 65536.0)) #define cfixed_to_int(f) ((f) >> 16) #define cfixed_to_float(x) ((float)((x) / 65536.0f)) #define cfixed_to_double(f) ((double)((f) / 65536.0)) … Continue reading

Loading

Posted in 编程技术 | Tagged | Leave a comment

快除 255:到底能有多快?

真金不怕火炼,我先前在《C 语言有什么奇技淫巧?》中给出的整数快速除以 255 的公式: #define div_255_fast(x) (((x) + (((x) + 257) >> 8)) >> 8) 有人觉得并没有快多少,还给出了测试: 红色为 255 快除法的消耗时间,看他的测试好像也只快了那么一点,是这样的么? 并非如此,我们只要把测试用例中的 long long j 改成 int j 就有比较大的性能提升了: 链接:http://quick-bench.com/t3Y2-b4isYIwnKwMaPQi3n9dmtQ 这才是真实的快除法性能。 原评测的作者其他地方都是用 int ,这里故意改成 64 位去和原始的 / 255 对齐,引入一个干扰项,得到一个比较慢的结果,到底是为了黑而黑呢?还是别的什么原因? 编译器生成的 / 255 … Continue reading

Loading

Posted in 编程技术 | Tagged | Leave a comment

快速范围判断:再来一种新写法

C 语言的魔法数不胜数,我在《C 语言有什么奇技淫巧?》中过给快速范围判断的公式,将: if (x >= minx && x <= maxx) … 改做: if (((x – minx) | (maxx – x)) >= 0) … 能有一倍的性能提升,我也提到,如果你的数据 99% 都是超出范围的那继续用 && 最快。今天再给大家介绍另外一种新写法,它有更均衡的性能,并且在最坏的情况下,任然表现良好: if ((unsigned)(x – minx) <= (unsigned)(maxx – minx)) … 该公式在各种测试数据中能有更均衡的表现,类型安全狂们可以写作: if … Continue reading

Loading

Posted in 编程技术 | Tagged | Leave a comment

C 语言有什么奇技淫巧?

C 语言的技巧有很多,列一些和性能有关的: 快速范围判断 经常要批量判断某些值在不在范围内,如果 int 检测是 [0, N) 的话: if (x >= 0 && x < N) … 众所周知,现代 CPU 优化,减分支是重要手段,上述两次判断可以简写为: if (((unsigned int)x) < N) … 减少判断次数。如果 int 检测范围是 [minx, maxx] 这种更常见的形式的话,怎么办呢? if (x >= minx && x <= … Continue reading

Loading

Posted in 编程技术 | Tagged | Leave a comment

最近都流行实现 Coroutine 么 ?

这两天看着大家都在实现无栈的 coroutine 都挺好玩的,但无栈协程限制太多,工程实践上很少用,所以昨天手痒写了个有栈的 coroutine ,接口反照 ucontext 的接口,不比无栈的复杂多少: int main(void) { ctx_context_t r; int hr; volatile int mode = 0; hr = ctx_getcontext(&r); printf(“ctx_getcontext() -> %d\n”, hr); if (mode == 0) { mode++; printf(“first run\n”); ctx_setcontext(&r); } else { printf(“second run\n”); … Continue reading

Loading

Posted in 编程技术 | Tagged | Leave a comment

十行代码实现命令行书签

路径书签/别名,用来给目录取个名字,要用时快速跳转,它不是用来代替:z.lua / z.sh / autojump 这类第一梯队的 cd 辅助工具的,而是作为他们的一个补充。 先前我想找个现成的路径书签的小插件,找到这个:pm 把现有目录添加成书签要: pm add my-project 跳到这个书签对应的目录要: pm go my-project 然后列出所有书签要: pm list 删除书签要: pm remove my-project 我又看了好几个书签软件,都大同小异,又难用,实现又啰嗦,这玩意儿居然写出 500 行以上的代码来,真是匪夷所思。所以我打算用十行代码实现一个更优雅的书签功能。 目标1:少打字 同样一个功能多打一个字母,做一千次就多打了 1K 的内容,能省则省,我不明白为什么这些插件做的都那么啰嗦,输入完命令名还得再输入 add/remove/go/list 之一的参数,然后才是书签名,要我来做,我会把命令名起短一点,比如叫做 m : m # 列出当前所有书签 m foo … Continue reading

Loading

Posted in 编程技术 | Tagged , | Leave a comment

C语言如何编译出一个不需要操作系统的程序

来个更短的,没有其他乱七八糟的东西,只有一个简短的 C文件,不需要 linux 环境: miniboot.c asm(“.long 0x1badb002, 0, (-(0x1badb002 + 0))”); unsigned char *videobuf = (unsigned char*)0xb8000; const char *str = “Hello, World !! “; int start_entry(void) { int i; for (i = 0; str[i]; i++) { videobuf[i * 2 … Continue reading

Loading

Posted in 编程技术 | Tagged , | Leave a comment