NahN2Regh 最近的时间轴更新
NahN2Regh

NahN2Regh

V2EX 第 46497 号会员,加入于 2013-10-08 18:46:56 +08:00
NahN2Regh 最近回复了
rust开启优化后, 与C没差别了, 都很快:

编译器 优化 时间
gcc -- real:0m3.930s, user:0m3.916s, sys:0m0.008s
gcc -O1 real:0m0.630s, user:0m0.624s, sys:0m0.000s
gcc -O2 real:0m0.002s, user:0m0.000s, sys:0m0.000s
rustc -- real:0m4.172s, user:0m4.000s, sys:0m0.020s
rustc --opt-level=1 real:0m0.003s, user:0m0.000s, sys:0m0.000s

gcc 的版本是4.9.1
rust版本是0.12

源代码:
[code]
$ cat sum.c
#include <stdio.h>

int main(int argc, char *argv[]) {

long i = 0;
long s = 0;
long limit = 1000000000;
while (i < limit) {
s = s + i;
i = i + 1;
}
printf("%ld\n", s);

return 0;
}
[/code]
[code]
$ cat sum.rs

fn main() {
let mut i = 0i64;
let mut s = 0i64;
let limit = 1000000000i64;
while i < limit {
s = s + i;
i = i + 1;
}
println!("{}", s);
}
[/code]
2013-11-15 10:12:02 +08:00
回复了 c19 创建的主题 Linux 有没有能hold住上万文件得文件管理器。
Qt, Gtk用的都是MVC结构的设计, 并且Gtk用MVC更彻底, 比如GtkScale等, 都是MVC的, 而Qt却不全是.

如你所说, Qt只处理被显示的那部分数据, 可Gtk不同, 每一次向GtkListStore中插入条目时, liststore.append(...), 它都会先对之前的条目做一些检查之类的工作(GtkTreePath?), 并且还有一些其它操作(这个我还没来的及读源码, 但在mail-list中有人提出来), 也是很繁琐的; 而且, Gtk默认情况下, 是在等所有数据都插入到ListStore之后, 才会显示出来, 然后才能接受用户的操作, 这种设计在数据非常多时, 就有严重的性能问题了.

另外, 关于gtk的性能问题, 不晓得有没有人用过glade(GUI的设计工具), 当在glade中编辑一些widget时, 比如GtkTreeView 向里面加入新的TreeViewColumn/CellRenderer时, 会特别慢, 并且CPU很会跑的很高(70%左右, 在我笔记本上), 通常, 右键, 加入一个新的CellRenderer时, 可以先吃一口苹果, 或者喝口水, 之后这个新的CellRenderer才被创建出来. 这个性能问题, 在glade2中就有存在, 也有一些人在glade的mailing list中反映, 可到现在glade3.15了, 还是依然存在.
相反的, Qt的designer就不存在类似的问题. 这里是一些提升GtkTreeView性能的一些小技巧, http://faq.pygtk.org/index.py?file=faq13.043.htp&req=show

当然, 我并不愿意来黑gtk. 我是很喜欢用这个GUI toolkit的. 也用它写了一打软件, 可是, 在开发这些软件的过程中, 确实发现了gtk存在的一些问题.

话又说回来了, Qt也是存在很多问题的, 与Gtk相比的话, 比如QSetting很明显不如GSetting好用, 后者是非常统一的, 实现了类似windows下的注册表的功能, 这样的话, 修改配置变得非常容易了; 而QSetting(在linux平台, 当然在windows平台, QSetting是用的注册表), 只是用ini格式的文件保存一下配置而已, 这样的话, 就很难被其它软件修改了. 举个例子, Gnome的壁纸, 其设置信息是用GSetting保存起来的, 我们只需要在其它程序中调用gsetting的API, 就可以修改gnome的壁纸了, 而不用理会这些设置是用的什么格式.


最后, 是广告环节, 有朋友写的酷我音乐盒的linux桌面客户端, 用的就是python/gtk的框架, 各位不妨试用一下.https://github.com/LiuLang/kwplayer
2013-11-15 01:12:06 +08:00
回复了 c19 创建的主题 Linux 有没有能hold住上万文件得文件管理器。
我去, 刚发的贴子里面有错字, 多打了一笔, '载'写成了'截'. v2ex为何不可以修改之前的贴子? 好纠结 ->||<-
2013-11-15 01:00:27 +08:00
回复了 c19 创建的主题 Linux 有没有能hold住上万文件得文件管理器。
慢的原因:
ubuntu 默认的文件管理器(ubnity/gnome桌面中用的是这个, KDE环境中默认的是dolphin)是nautilus. 它使用了gtk3 的GtkIconView, gtk有一个缺陷就是在GtkListStore(GtkIconView的model)载入数以千计条的数据时, 会非常慢, 更慢的是, 要载入的数据中包含图标. 如果你的那个目录里包含了大量的图片, nautilus会默认启用图片预览功能, 那会更加缓慢. 慢, 是gtk框架本身的设计问题, 当然这个问题可以在写程序时用一些技巧来避免.

解决方案:
1.给nautilus打补丁, 使用lazy loading技术, 就像在网页中载入大量图片那样的. 当滚动条向下滚动时, 才截入接下来要显示的内容, 这个比较容易实现; 或者也可以加入后台自动截入的功能, 先显示前一部分, 后面的再一批批地加载.

2.或者换用Qt系列的文件管理器(dolphin之类的), Qt在ListView, TreeView等方面做的优化比gtk的要好, 速度也更快. 之前我测试的数据显示, 载入同样的数据(估计有10K条sql记录), 感觉qt比gtk快了有10倍, 并且qt的在滚动时还更顺畅. 我不是在黑gtk, 但性能方面, 这确实是gtk本身设计的不足, 可以搜索一下 gtk liststore performance, 这个问题已经存大数年了, 仍然没有被修复.

3. 或者最简单的, 关闭nautilus的preview功能; 用treeview来显示(而不是默认的IconView); 减少要显示的条目, 比如只显示filename, date等少数类信息. 这样设置的话性能会有所提升.

另外, 能问一下你为什么要这么做吗? 好玩? 数据量大的话果断用终端呀. ls | less 或者 ls | grep也不慢.
@kehr 不客气. 设计界面时有遇到什么问题了, 可以随时找我探讨, 大家共同进步嘛.[email][email protected][/email]

真实的情况是, 我为了回答你这个问题, 才注册的v2ex帐号.
如果没有必要支持windows系统的话, 推荐用PyGObject.

gtk写起来很简单的, 尤其是gtk3, 引入了相当多的新功能, 绘制界面更给力! 还可以直接用CSS来定义软件的主题, 很灵活.
在debian/ubuntu/fedora等系统里, 要做gtk的开发, 至少得安装这几个软件: devhelp用于查看API的, glade用于直接绘制软件界面的.

glade是将界面转成了xml文件, gtk可以直接读取这类文件, 用GtkBuilder, GTkUIManger等;
也可以手动来写界面的xml文件, 将像手写html文件那样, 刚才开始可能记不住, 但写几个之后就发现很容易;
这两种方式设计的界面是跨语言的, C/C++/Python/Vala/...都是可直接用的.

另外, 程序的样式可以单独放到一些CSS文件里.
只用Python来实现程序的逻辑.

这种方式就像写网页, 用html来做页面结构, CSS来控制样式, javascript控制逻辑.

当然了, 你也可以把所有的工作都用python来做, 比如软件界面用python一点点来绘制, 样式的话也是.

还有, gtk里可以直接使用cairo, 强大的2D矢量绘图库, 几行代码就可以实现很酷的特效.

我的PyGObject的开发经验是, 使用bpython3来查gtk的api, 因为bpython3支持自动补全, 可以直接显示widget的所有方法, 包括父类的方法. 没有完整的PyGObject API, 因为它与gtk的C API几乎完全一样, 我认为也没必要存在.
我还用glade来设计软件的大致结构, 然后用python来实现.
样式的话, 很少用, 因为gtk3(gnome)的默认主题已经很好了.

我用vim来写的, F4直接运行, 如果发现了界面的问题, 直接关闭; 然后修改代码, 再F4, 再确认是否存在问题. 我很喜欢这种快速反馈的方法, 写网页时也是这样的流程, 开发速度非常高.

参考资料:
入门的话, 可以看这个http://python-gtk-3-tutorial.readthedocs.org/en/latest/
cairo的: http://zetcode.com/gfx/pycairo/
更详细的是翻看devhelp里的API.

另一个技巧是, 用glade来尝试着设计, 然后需要修改一个widget的某个属性时, 可以在右下角的属性设置里右键, 会在devhelp中定位相应的API, 这很直观.


推荐一个有人最近发布的酷我音乐盒的 PyGObject实现: https://github.com/LiuLang/kwplayer
可以读一下他的代码.
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6010 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 12ms · UTC 01:55 · PVG 09:55 · LAX 17:55 · JFK 20:55
Developed with CodeLauncher
♥ Do have faith in what you're doing.