V2EX NahN2Regh
 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     Solana     1385 人在线   最高记录 6679       Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 12ms UTC 16:51 PVG 00:51 LAX 08:51 JFK 11:51
Do have faith in what you're doing.
ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86