|
Packit |
1470ea |
# Chinese (China) translation for gnome-devel-docs.
|
|
Packit |
1470ea |
# Copyright (C) 2010 gnome-devel-docs's COPYRIGHT HOLDER
|
|
Packit |
1470ea |
# This file is distributed under the same license as the gnome-devel-docs package.
|
|
Packit |
1470ea |
# YunQiang Su <wzssyqa@gmail.com>, 2010.
|
|
Packit |
1470ea |
#
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
"Project-Id-Version: gnome-devel-docs master\n"
|
|
Packit |
1470ea |
"POT-Creation-Date: 2010-05-14 17:00+0000\n"
|
|
Packit |
1470ea |
"PO-Revision-Date: 2010-07-21 14:01+0800\n"
|
|
Packit |
1470ea |
"Last-Translator: YunQiang Su <wzssyqa@gmail.com>\n"
|
|
Packit |
1470ea |
"Language-Team: Chinese (China) <i18n-zh@googlegroups.com>\n"
|
|
Packit |
1470ea |
"MIME-Version: 1.0\n"
|
|
Packit |
1470ea |
"Content-Type: text/plain; charset=UTF-8\n"
|
|
Packit |
1470ea |
"Content-Transfer-Encoding: 8bit\n"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-intro.xml:3(title)
|
|
Packit |
1470ea |
msgid "The Quick Guide to Optimizing GNOME Programs"
|
|
Packit |
1470ea |
msgstr "优化文档的快速指南"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-intro.xml:5(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"This is a brief introduction to optimization, both the hows and the whys. "
|
|
Packit |
1470ea |
"Details of individual tools and techniques are left for later articles, but "
|
|
Packit |
1470ea |
"a collection of hints and tricks is provided."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
"这是关于优化的一个简单介绍,以及如何做和为何这么做。每个工具和技术的细节留到"
|
|
Packit |
1470ea |
"未来的文档中,但是提供了一些提示和技巧。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-intro.xml:10(title)
|
|
Packit |
1470ea |
msgid "What are we Optimizing?"
|
|
Packit |
1470ea |
msgstr "什么需要优化?"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-intro.xml:11(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"When we optimize for GNOME the first thing to remember is this: we are not "
|
|
Packit |
1470ea |
"trying to make the program better, we are trying to make the person using "
|
|
Packit |
1470ea |
"the computer happier."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
"优化 GNOME 程序时需要记住的第一件事情是:我们在做的不是使程序更好,而是让人们"
|
|
Packit |
1470ea |
"更快乐地使用计算机。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-intro.xml:14(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"Better programs make people happier, but there are some improvements that "
|
|
Packit |
1470ea |
"will make them a lot happier than others: Responsiveness, start-up time, "
|
|
Packit |
1470ea |
"easy to access commands and not having the computer go into swap the moment "
|
|
Packit |
1470ea |
"more than two programs are open."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
"更好的程序可以使人们更快乐,但是一些改进将使他们比别人更快乐:反应速度、启动"
|
|
Packit |
1470ea |
"时间、更容易找到命令以及在多个程序同时打开时不让计算机卡住。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-intro.xml:17(para)
|
|
Packit |
1470ea |
#, fuzzy
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"Traditional optimization tackles concepts like CPU use, code size, the "
|
|
Packit |
1470ea |
"number of mouse clicks and the memory use of the program. This second list "
|
|
Packit |
1470ea |
"has been chosen to correlate with the first list, however there is an "
|
|
Packit |
1470ea |
"important difference: The person using GNOME doesn't care about the second "
|
|
Packit |
1470ea |
"list, but they care a lot about the first list. When optimizing GNOME "
|
|
Packit |
1470ea |
"programs we will reduce CPU use, memory use and all those things, but these "
|
|
Packit |
1470ea |
"are the means to the end, not the final goal. We are optimizing for people."
|
|
Packit |
1470ea |
msgstr "传统的优化解决 CPU 使用、代码大小、鼠标点击量以及内存使用。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-intro.xml:23(title)
|
|
Packit |
1470ea |
msgid "Doing the Optimization"
|
|
Packit |
1470ea |
msgstr "进行优化"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-intro.xml:24(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"The previous section omitted one important qualifier: To optimize something "
|
|
Packit |
1470ea |
"it has to be measurable. You can't measure happiness. However, you can "
|
|
Packit |
1470ea |
"measure start-up time so you can tell if you have improved it. Happiness "
|
|
Packit |
1470ea |
"will then, hopefully, follow."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
"上面的章节忽略了一个重要的指标:优化的东西必须是可量测的。快乐是无法量测的,"
|
|
Packit |
1470ea |
"但是可以量测启动时间,然后讨论是否需要对其进行优化。希望快乐也能随之而来吧。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-intro.xml:27(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"Optimization is the process of measurement, refinement and re-measurement. "
|
|
Packit |
1470ea |
"So the first thing you must do is find a way to measure what you are "
|
|
Packit |
1470ea |
"optimizing. Ideally this measurement is a single number, for example: the "
|
|
Packit |
1470ea |
"time taken to perform a task. This is your benchmark, it is the only way to "
|
|
Packit |
1470ea |
"tell if you are winning or losing. There is a big difference between a "
|
|
Packit |
1470ea |
"program that <emphasis>should</emphasis> be fast and a program that "
|
|
Packit |
1470ea |
"<emphasis>is</emphasis> fast."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
"优化是测量、精益求精和重新测量的过程。所以,第一件必须要做的事情就是找到一种"
|
|
Packit |
1470ea |
"测量要优化的事情的方法。这个测量结果最好是一个数字,例如:执行一个任务所需要"
|
|
Packit |
1470ea |
"的时间。这是您的性能测试,这时唯一可以告诉您通过还是失败的方法。在一个程序 "
|
|
Packit |
1470ea |
"<emphasis>应该</emphasis> 快还是 <emphasis>已经</emphasis> 快之间的区别。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-intro.xml:30(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"Once you have a basic benchmark you need to find out why your code is not "
|
|
Packit |
1470ea |
"doing as well as it should. It is tempting to do this by inspection: just "
|
|
Packit |
1470ea |
"looking at the code and trying to spot something that looks like it needs "
|
|
Packit |
1470ea |
"improvement. You will invariably be wrong. Using a profiler to get a "
|
|
Packit |
1470ea |
"detailed break-down of what your program really does is the only way to be "
|
|
Packit |
1470ea |
"sure."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
"进行了基本的性能测试之后,您需要找出为什么代码没有如其应该的那样快。可以通过"
|
|
Packit |
1470ea |
"这样来尝试:检查代码找出需要改进的地方。您可能总会是错误的。使用一个性能分析"
|
|
Packit |
1470ea |
"器来获取详细的程序每步的工作是唯一可以保证是正确的方法。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-intro.xml:33(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"Usually the problem is isolated to small sections of code. Pick the worst "
|
|
Packit |
1470ea |
"place and concentrate on that first. Once that is done, rerun the profiler "
|
|
Packit |
1470ea |
"and repeat. As you proceed the gains made at each step will get less and "
|
|
Packit |
1470ea |
"less, at some point you will have to decide that the results are good "
|
|
Packit |
1470ea |
"enough. If your efforts are only extracting 10% improvements then you are "
|
|
Packit |
1470ea |
"well past the point where you should have stopped."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
"程序通常可以分为很小的代码块。找出性能最差的地方并集中精力首先处理。完成之"
|
|
Packit |
1470ea |
"后,重新运行性能分析器然后重复。每进行一次这样的努力将获得的越来越少,您可以"
|
|
Packit |
1470ea |
"在一个点上认为结果已经足够好了。如果您的努力只能获取 10% 的改进,最好略过这个"
|
|
Packit |
1470ea |
"点,并且应该停止。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-intro.xml:36(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"Don't forget the big picture. For example, rather than just trying to speed "
|
|
Packit |
1470ea |
"up a piece of code, ask yourself if it needs to be run at all. Could it be "
|
|
Packit |
1470ea |
"combined with another piece of code? Can the results of previous "
|
|
Packit |
1470ea |
"calculations be saved and reused? It won't even need to be optimized if it "
|
|
Packit |
1470ea |
"is in a place where the user is never going to notice it. Worse still, the "
|
|
Packit |
1470ea |
"code may already be optimized and is doing the heavy calculations now to "
|
|
Packit |
1470ea |
"avoid doing them later. Code does not run in isolation and neither does the "
|
|
Packit |
1470ea |
"optimization process."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
"不要忘记大图片。例如,在尝试加速一段代码之前,先想想是否真的需要它。是否可以"
|
|
Packit |
1470ea |
"和其它代码块结合?前面计算的结果是否可以保存起来并重用?如果是用户根本不会注"
|
|
Packit |
1470ea |
"意的地方就甚至不需要优化。更糟的是,代码已经优化了,并且正在进行高负载运算,"
|
|
Packit |
1470ea |
"那就需要避免稍候再次进行运算。不孤立运行的代码也不需要优化过程。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-intro.xml:41(title)
|
|
Packit |
1470ea |
msgid "Hints"
|
|
Packit |
1470ea |
msgstr "提示"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-intro.xml:43(title)
|
|
Packit |
1470ea |
msgid "The Fundamentals"
|
|
Packit |
1470ea |
msgstr "基本原理"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-intro.xml:45(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"Re-run your benchmark after every change you make to the code and keep a log "
|
|
Packit |
1470ea |
"of everything you change and how it affects the benchmark. This lets you "
|
|
Packit |
1470ea |
"undo mistakes and also helps you not to repeat mistakes."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
"对代码进行更改之后重新运行性能测试,记录每次的更改及对性能的影响。这可以帮助"
|
|
Packit |
1470ea |
"您修复错误,也可以帮您避免重复犯错。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-intro.xml:50(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"Make sure your code is correct and bug-free before optimizing it. Check that "
|
|
Packit |
1470ea |
"it remains correct and bug-free after optimization."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
"在进行优化之前确保代码是正确且没有缺陷的。在优化之后检查是否仍然是正确且没有"
|
|
Packit |
1470ea |
"缺陷的。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-intro.xml:55(para)
|
|
Packit |
1470ea |
msgid "Optimize at the high level before optimizing the details."
|
|
Packit |
1470ea |
msgstr "在对细节进行优化之前先在高层进行优化。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-intro.xml:60(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"Use the right algorithm. The classic text-book example is using quick-sort "
|
|
Packit |
1470ea |
"instead of bubble-sort. There are many others, some save memory, some save "
|
|
Packit |
1470ea |
"CPU. Also, see what shortcuts you can make: you can do quicker than quick-"
|
|
Packit |
1470ea |
"sort if you are prepared to make some compromises."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
"使用正确的算法。经典的文本排序使用的是快速排序而不是冒泡排序。还有很多其它,"
|
|
Packit |
1470ea |
"一些可以节省内存,一些可以节省 CPU。同样,寻找您可以走的捷径:如果愿意进行某"
|
|
Packit |
1470ea |
"些组合,甚至可以比快速排序更快。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-intro.xml:65(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"Optimization is a trade-off. Caching results speeds up calculations, but "
|
|
Packit |
1470ea |
"increases memory use. Saving data to disk saves memory, but costs time when "
|
|
Packit |
1470ea |
"it is loaded back from disk."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
"优化就是折衷。缓存结果可以加速运行,但是会增加内存使用。将数据保存到磁盘可以"
|
|
Packit |
1470ea |
"节省内存,但从磁盘中加载时浪费时间。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-intro.xml:70(para)
|
|
Packit |
1470ea |
#, fuzzy
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"Make sure you choose a wide variety of inputs to optimize against. If you "
|
|
Packit |
1470ea |
"don't it is easy to end up with a piece of code carefully optimized for one "
|
|
Packit |
1470ea |
"file and no others."
|
|
Packit |
1470ea |
msgstr "确保选择了足够多的输入来再次进行优化。如果不能容易"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-intro.xml:75(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"Avoid expensive operations: Multiple small disk reads. Using up lots of "
|
|
Packit |
1470ea |
"memory so disk swapping becomes necessary. Avoid anything that writes or "
|
|
Packit |
1470ea |
"reads from the hard disk unnecessarily. The network is slow too. Also avoid "
|
|
Packit |
1470ea |
"graphics operations that need a response from the X server."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
"避免高消耗的操作:多次从磁盘读取很少的数据。使用很多内存会需要交换。避免任何"
|
|
Packit |
1470ea |
"不需要的硬盘读写。网络也是很慢的。同样避免需要 X 服务器响应的图形操作。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-intro.xml:81(title)
|
|
Packit |
1470ea |
msgid "Traps for the Unwary"
|
|
Packit |
1470ea |
msgstr "粗心造成的陷阱"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-intro.xml:83(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"Beware of side effects. There can often be strange interactions between "
|
|
Packit |
1470ea |
"different sections of code, a speed-up in one part can slow another part "
|
|
Packit |
1470ea |
"down."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
"注意副作用。在不同的代码部分之间经常有奇怪的交互,加速一个部分可能会使另一部"
|
|
Packit |
1470ea |
"分的速度降低。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-intro.xml:88(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"When timing code, even on a quiet system, events outside the program add "
|
|
Packit |
1470ea |
"noise to the timing results. Average over multiple runs. If the code is very "
|
|
Packit |
1470ea |
"short, timer resolution is also a problem. In this case measure the time the "
|
|
Packit |
1470ea |
"computer takes to run the code 100 or 1000 times. If the times you are "
|
|
Packit |
1470ea |
"recording are longer than a few seconds, you should be OK."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
"测量代码的运行时间时,即使在安静的系统上,程序之外的事件也会对计时产生影响。"
|
|
Packit |
1470ea |
"多次运行取平均值。如果代码非常短,计时精度也是一个问题。这时,测量代码运行 "
|
|
Packit |
1470ea |
"100 甚至 1000 次的时间。如果您记录的时间长达数秒,就可以了。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-intro.xml:93(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"It is very easy to be misled by the profiler. There are stories of people "
|
|
Packit |
1470ea |
"optimizing the operating system idle-loop because that is where it spent all "
|
|
Packit |
1470ea |
"its time! Don't optimize code that does nothing the user cares about."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
"也很容易被性能分析器误导。有人曾经优化掉了操作系统的 idle-loop,因为它耗费掉"
|
|
Packit |
1470ea |
"了系统所有的时间。不要优化做用户根本不关心的部分。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-intro.xml:98(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"Remember the resources on the X server. Your program's memory usage doesn't "
|
|
Packit |
1470ea |
"include the pixmaps that are stored in the X server's process, but they are "
|
|
Packit |
1470ea |
"still using up memory. Use xrestop to see what resources your program is "
|
|
Packit |
1470ea |
"using."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
"别忘记了 X 服务器上的时间。您的程序的内存使用量并没有包含在 X 服务器进程中存"
|
|
Packit |
1470ea |
"储的像素影射,但它们仍然使用内存。使用 xrestop 查看您的程序使用的资源。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-intro.xml:104(title)
|
|
Packit |
1470ea |
msgid "Low Level Hints"
|
|
Packit |
1470ea |
msgstr "底层提示"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-intro.xml:106(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"When optimizing memory use, be wary of the difference between peak usage and "
|
|
Packit |
1470ea |
"average memory usage. Some memory is almost always allocated, this is "
|
|
Packit |
1470ea |
"usually bad. Some is only briefly allocated, this may be quite acceptable. "
|
|
Packit |
1470ea |
"Tools like massif use the concept of space-time, the product of memory used "
|
|
Packit |
1470ea |
"and the duration it was allocated for, instead."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
"优化内存使用时,警惕高峰使用量和平均使用量的区别。总是持有申请的内存是不好"
|
|
Packit |
1470ea |
"的。一些仅仅是简单的申请,还是可以接受的。类似于 massif 的工具使用时空 (内存"
|
|
Packit |
1470ea |
"使用量和使用时间的乘积) 的概念来代替。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-intro.xml:111(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"Time simplified bits of code that do only the things you know are essential, "
|
|
Packit |
1470ea |
"this gives an absolute lower limit on the time your code will take. For "
|
|
Packit |
1470ea |
"example, when optimizing a loop time the empty loop. If that is still too "
|
|
Packit |
1470ea |
"long no amount of micro-optimization will help and you will have to change "
|
|
Packit |
1470ea |
"your design. Make sure the compiler doesn't optimize away your empty loop."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-intro.xml:116(para)
|
|
Packit |
1470ea |
#, fuzzy
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"Move code out from inside loops. A slightly more complicated piece of code "
|
|
Packit |
1470ea |
"that is executed once is far quicker than a simple piece of code executed a "
|
|
Packit |
1470ea |
"thousand times. Avoid calling slow code often."
|
|
Packit |
1470ea |
msgstr "去除内部循环的代码。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-intro.xml:121(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"Give the compiler as many hints as possible. Use the const keyword. Use "
|
|
Packit |
1470ea |
"<envar>G_INLINE_FUNC</envar> for short, frequently called, functions. Look "
|
|
Packit |
1470ea |
"up <envar>G_GNUC_PURE</envar>, <envar>G_LIKELY</envar> and the other glib "
|
|
Packit |
1470ea |
"miscellaneous macros. Use the macros instead of gcc-specific keywords to "
|
|
Packit |
1470ea |
"ensure portability."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
"给编译器尽可能多的提示。使用常量关键字。使用 <envar>G_INLINE_FUNC</envar> 作"
|
|
Packit |
1470ea |
"为经常调用的函数的简称。查看 <envar>G_GNUC_PURE</envar>,<envar>G_LIKELY</"
|
|
Packit |
1470ea |
"envar> 和其它 glib 杂项宏。使用这些宏代替 gcc 专用的关键字,以确保可移植性。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-intro.xml:126(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"Don't use assembly language. It is not portable and, while it may be fast on "
|
|
Packit |
1470ea |
"one processor, it is not even guaranteed to be fast on every processor that "
|
|
Packit |
1470ea |
"supports that architecture (e.g. Athlon vs. Pentium 4)."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
"不要使用汇编语言。汇编语言不可移植,而且虽然可能在一个处理器上很快,但是甚至"
|
|
Packit |
1470ea |
"在支持同样处理器架构的处理器上也不能保证可以很快 (例如速龙和奔四的区别)。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-intro.xml:131(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"Don't rewrite an existing library routine unless you are sure it is "
|
|
Packit |
1470ea |
"unnecessarily slow. Many CPU-intensive library routines have already been "
|
|
Packit |
1470ea |
"optimized. Conversely, some library routines are slow, especially ones that "
|
|
Packit |
1470ea |
"make system calls to the operating system."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
"不要重写已有的库函数,除非确定库函数不可接受得慢。很多 CPU 敏感的库函数都是优"
|
|
Packit |
1470ea |
"化过的。相反地,一些库函数也是慢的,尤其是那些使用系统调用的。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-intro.xml:136(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"Minimize the number of libraries you link to. The fewer libraries to link "
|
|
Packit |
1470ea |
"in, the faster the program starts. This is a difficult thing to do with "
|
|
Packit |
1470ea |
"GNOME."
|
|
Packit |
1470ea |
msgstr "使用尽量少的库。链接到的库越少,程序启动越快。对于 GNOME,这很难达到。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-intro.xml:142(title)
|
|
Packit |
1470ea |
msgid "High Level Tricks"
|
|
Packit |
1470ea |
msgstr "高层技巧"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-intro.xml:144(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"Take advantage of concurrency. This doesn't just mean using multiple "
|
|
Packit |
1470ea |
"processors, it also means taking advantage of the time the user spends "
|
|
Packit |
1470ea |
"thinking about what they are going to do next to perform some calculations "
|
|
Packit |
1470ea |
"in anticipation. Do calculations while waiting for data to be loaded off "
|
|
Packit |
1470ea |
"disk. Take advantage of multiple resources, use them all at once."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
"发挥并发的优势。这并不仅仅意味着使用多处理器,也意味着减少用户执行一些计算所"
|
|
Packit |
1470ea |
"预期的时间。在等待从磁盘上加载数据是进行计算。充分使用多种资源,同时使用它"
|
|
Packit |
1470ea |
"们。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-intro.xml:149(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"Cheat. The user only has to think that the computer is fast, it doesn't "
|
|
Packit |
1470ea |
"matter whether it actually is or not. It is the time between the command and "
|
|
Packit |
1470ea |
"the answer that is important, it doesn't matter if the response is pre-"
|
|
Packit |
1470ea |
"calculated, cached, or will in fact be worked out later at a more convenient "
|
|
Packit |
1470ea |
"time, as long as the user gets what they expect."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
"欺骗。用户仅仅认为计算机很快,而不管实际上是否如此。命令和结果之间的时间很重"
|
|
Packit |
1470ea |
"要,而无论是提前计算的、缓存的还是在稍候方便的时间进行实际计算,尽快地给出用"
|
|
Packit |
1470ea |
"户期望的结果。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-intro.xml:154(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"Do things in the idle loop. It is easier to program than using full multi-"
|
|
Packit |
1470ea |
"threading but still gets things done out of the users eye. Be careful "
|
|
Packit |
1470ea |
"though, if you spend too long in the idle loop your program will become "
|
|
Packit |
1470ea |
"sluggish. So regularly give control back to the main loop."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
"在空闲循环中进行某些工作。这比多线程更容易编程但仍然在用户视线之外进行了工"
|
|
Packit |
1470ea |
"作。仍然需要注意,如果在空闲循环中花费太多时间,程序将变卡。所以需要经常返回"
|
|
Packit |
1470ea |
"主循环。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-intro.xml:159(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"If all else fails, tell the user that the code is going to be slow and put "
|
|
Packit |
1470ea |
"up a progress bar. They won't be as happy as if you had just presented the "
|
|
Packit |
1470ea |
"results, but they will at least know the program hasn't crashed and they can "
|
|
Packit |
1470ea |
"go get a cup of coffee."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
"如果都失败了,告诉用户代码将会比较慢并且使用进度条。如果仅仅给出结果,用户并"
|
|
Packit |
1470ea |
"不会高兴,他们至少会知道程序没有崩溃,他们可以去喝杯咖啡。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#. When image changes, this message will be marked fuzzy or untranslated for you.
|
|
Packit |
1470ea |
#. It doesn't matter what you translate it to: it's not used at all.
|
|
Packit |
1470ea |
#: C/optimization-massif.xml:52(None)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"@@image: 'figures/massif-before.png'; md5=1a6b2ace548e6789ab8bfacb3727b345"
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
"@@image: 'figures/massif-before.png'; md5=1a6b2ace548e6789ab8bfacb3727b345"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#. When image changes, this message will be marked fuzzy or untranslated for you.
|
|
Packit |
1470ea |
#. It doesn't matter what you translate it to: it's not used at all.
|
|
Packit |
1470ea |
#: C/optimization-massif.xml:114(None)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"@@image: 'figures/massif-after.png'; md5=36d1b4ad7ab49b28b69ad3eabbaa7069"
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
"@@image: 'figures/massif-after.png'; md5=36d1b4ad7ab49b28b69ad3eabbaa7069"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-massif.xml:3(title)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"Using <application>Massif</application> for Profiling Memory Use in GNOME "
|
|
Packit |
1470ea |
"Software"
|
|
Packit |
1470ea |
msgstr "使用 <application>Massif</application> 分析 GNOME 软件的内存使用"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-massif.xml:5(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"This article describes how to use the <application>Massif</application> heap "
|
|
Packit |
1470ea |
"profiler with GNOME applications. We describe how to invoke, interpret, and "
|
|
Packit |
1470ea |
"act on the output of <application>Massif</application>. The "
|
|
Packit |
1470ea |
"<application>Same GNOME</application> game is used as an example."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
"这篇文章描述怎样在 GNOME 程序中使用 <application>Massif</application> 堆分析"
|
|
Packit |
1470ea |
"器,解释怎样调用、理解已经对 <application>Massif</application> 的输出进行操"
|
|
Packit |
1470ea |
"作。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-massif.xml:10(title)
|
|
Packit |
1470ea |
msgid "Introduction"
|
|
Packit |
1470ea |
msgstr "简介"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-massif.xml:11(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"<application>Massif</application> is a member of the
|
|
Packit |
1470ea |
"url=\"http://valgrind.org/\">valgrind</ulink> suite of memory-profiling "
|
|
Packit |
1470ea |
"tools. Its purpose is to give a detailed view of dynamic memory usage during "
|
|
Packit |
1470ea |
"the lifetime of the program. Specifically it records the memory use of the "
|
|
Packit |
1470ea |
"heap and the stack."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
"<application>Massif</application> 是
|
|
Packit |
1470ea |
"valgrind.org/\">valgrind</ulink> 内存分析套件的一个成员。它的目的是在程序的生"
|
|
Packit |
1470ea |
"命期里给出动态内存使用的细节。它会专门记录堆栈的内存使用。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-massif.xml:14(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"The heap is the region of memory which is allocated with functions like "
|
|
Packit |
1470ea |
"malloc. It grows on demand and is usually the largest region of memory in a "
|
|
Packit |
1470ea |
"program. The stack is where all the local data for functions is stored. This "
|
|
Packit |
1470ea |
"includes the \"automatic\" variables in C and the return address for "
|
|
Packit |
1470ea |
"subroutines. The stack is typically a lot smaller and a lot more active than "
|
|
Packit |
1470ea |
"the heap. We won't consider the stack explicitly since <application>Massif</"
|
|
Packit |
1470ea |
"application> treats it as though it were just another part of the heap. "
|
|
Packit |
1470ea |
"<application>Massif</application> also gives information about how much "
|
|
Packit |
1470ea |
"memory is used to manage the heap."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
"堆是使用类似于 malloc 的函数分配内存的地方。它根据需要增长,而且通常是程序中"
|
|
Packit |
1470ea |
"最大的内存区域。栈是存放函数的本地数据的地方,包括 C 语言中的自动变量和子函数"
|
|
Packit |
1470ea |
"的返回地址。栈通常比堆更小更活跃。我们并没有显式地考虑栈,因为 "
|
|
Packit |
1470ea |
"<application>Massif</application> 将其认定为堆的另外一部分。"
|
|
Packit |
1470ea |
"<application>Massif</application> 也给出管理堆所使用的内存量。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-massif.xml:17(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"<application>Massif</application> produces two output files: a graphical "
|
|
Packit |
1470ea |
"overview in a postscript file and a detailed breakdown in a text file."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
"<application>Massif</application> 产生两个输出文件:一个 postscript 格式的概"
|
|
Packit |
1470ea |
"况以及一个文本格式的细节详述。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-massif.xml:22(title)
|
|
Packit |
1470ea |
msgid "Using <application>Massif</application> with GNOME"
|
|
Packit |
1470ea |
msgstr "在 GNOME 中使用 <application>Massif</application>"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-massif.xml:23(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"<application>Massif</application> has very few options and for many programs "
|
|
Packit |
1470ea |
"does not need them. However for GNOME applications, where memory allocation "
|
|
Packit |
1470ea |
"might be buried deep in either glib or GTK, the number of levels down the "
|
|
Packit |
1470ea |
"call-stack Massif descends needs to be increased. This is achieved using the "
|
|
Packit |
1470ea |
"--depth parameter. By default this is 3; increasing it to 5 will guarantee "
|
|
Packit |
1470ea |
"the call-stack reaches down to your code. One or two more levels may also be "
|
|
Packit |
1470ea |
"desirable to provide your code with some context. Since the level of detail "
|
|
Packit |
1470ea |
"becomes quickly overwhelming it is best to start with the smaller depth "
|
|
Packit |
1470ea |
"parameter and only increase it when it becomes apparent that it isn't "
|
|
Packit |
1470ea |
"sufficient."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-massif.xml:26(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"It is also useful to tell <application>Massif</application> which functions "
|
|
Packit |
1470ea |
"allocate memory in glib. It removes an unnecessary layer of function calls "
|
|
Packit |
1470ea |
"from the reports and gives you a clearer idea of what code is allocating "
|
|
Packit |
1470ea |
"memory. The allocating functions in glib are g_malloc, g_malloc0, g_realloc, "
|
|
Packit |
1470ea |
"g_try_malloc, and g_mem_chunk_alloc. You use the --alloc-fn option to tell "
|
|
Packit |
1470ea |
"Masiff about them."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-massif.xml:29(para)
|
|
Packit |
1470ea |
msgid "Your command-line should therefore look something like:"
|
|
Packit |
1470ea |
msgstr "因此,您的命令行应该类似于:"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-massif.xml:32(programlisting)
|
|
Packit |
1470ea |
#, no-wrap
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"\n"
|
|
Packit |
1470ea |
"valgrind --tool=massif --depth=5 --alloc-fn=g_malloc --alloc-fn=g_realloc --alloc-fn=g_try_malloc \\\n"
|
|
Packit |
1470ea |
" --alloc-fn=g_malloc0 --alloc-fn=g_mem_chunk_alloc same-gnome\n"
|
|
Packit |
1470ea |
" "
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
"\n"
|
|
Packit |
1470ea |
"valgrind --tool=massif --depth=5 --alloc-fn=g_malloc --alloc-fn=g_realloc --alloc-fn=g_try_malloc \\\n"
|
|
Packit |
1470ea |
" --alloc-fn=g_malloc0 --alloc-fn=g_mem_chunk_alloc same-gnome\n"
|
|
Packit |
1470ea |
" "
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-massif.xml:36(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"<application>Same GNOME</application> is the program we will be using as an "
|
|
Packit |
1470ea |
"example. Be warned that, since valgrind emulates the CPU, it will run "
|
|
Packit |
1470ea |
"<emphasis>very</emphasis> slowly. You will also need a lot of memory."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
"<application>Same GNOME</application> 是我们用来作为范例的程序。必须要警告:"
|
|
Packit |
1470ea |
"因为 valgrind 仿真 CPU,它运行得将会<emphasis>非常</emphasis> 慢,同时也需要"
|
|
Packit |
1470ea |
"很多内存。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-massif.xml:41(title)
|
|
Packit |
1470ea |
msgid "Interpreting the Results"
|
|
Packit |
1470ea |
msgstr "对结果的解释"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-massif.xml:42(para)
|
|
Packit |
1470ea |
#, fuzzy
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"The graphical output of <application>Massif</application> is largely self "
|
|
Packit |
1470ea |
"explanatory. Each band represents the memory allocated by one function over "
|
|
Packit |
1470ea |
"time. Once you identify which bands are using the most memory, usually the "
|
|
Packit |
1470ea |
"big thick ones at the top you will have to consult the text file for the "
|
|
Packit |
1470ea |
"details."
|
|
Packit |
1470ea |
msgstr "<application>Massif</application> 的输出很大程度上是自解释的。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-massif.xml:45(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"The text file is arranged as a hierarchy of sections, at the top is a list "
|
|
Packit |
1470ea |
"of the worst memory users arranged in order of decreasing spacetime. Below "
|
|
Packit |
1470ea |
"this are further sections, each breaking the results down into finer detail "
|
|
Packit |
1470ea |
"as you proceed down the call-stack. To illustrate this we will use the "
|
|
Packit |
1470ea |
"output of the command above."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-massif.xml:49(title)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"<application>Massif</application> output for the unoptimized version of the "
|
|
Packit |
1470ea |
"<application>Same GNOME</application> program."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
"未优化版本的 <application>Same GNOME</application> 程序的 "
|
|
Packit |
1470ea |
"<application>Massif</application> 输出。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-massif.xml:56(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"<xref linkend=\"optimization-massif-FIG-output-unoptimized\"/> shows a "
|
|
Packit |
1470ea |
"typical postscript output from <application>Massif</application>. This is "
|
|
Packit |
1470ea |
"the result you would get from playing a single game of <application>Same "
|
|
Packit |
1470ea |
"GNOME</application> (version 2.8.0) and then quitting. The postscript file "
|
|
Packit |
1470ea |
"will have a name like <filename>massif.12345.ps</filename> and the text file "
|
|
Packit |
1470ea |
"will be called <filename>massif.12345.txt</filename>. The number in the "
|
|
Packit |
1470ea |
"middle is the process ID of the program that was examined. If you actually "
|
|
Packit |
1470ea |
"try this example you will find two versions of each file, with slightly "
|
|
Packit |
1470ea |
"different numbers, this is because <application>Same GNOME</application> "
|
|
Packit |
1470ea |
"starts a second process and <application>Massif</application> follows that "
|
|
Packit |
1470ea |
"too. We will ignore this second process, it consumes very little memory."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-massif.xml:59(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"At the top of the graph we see a large yellow band labelled gdk_pixbuf_new. "
|
|
Packit |
1470ea |
"This seems like an ideal candidate for optimization, but we will need to use "
|
|
Packit |
1470ea |
"the text file to find out what is calling gdk_pixbuf_new. The top of the "
|
|
Packit |
1470ea |
"text file will look something like this:"
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-massif.xml:62(programlisting)
|
|
Packit |
1470ea |
#, no-wrap
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"\n"
|
|
Packit |
1470ea |
"Command: ./same-gnome \n"
|
|
Packit |
1470ea |
"\n"
|
|
Packit |
1470ea |
"== 0 ===========================\n"
|
|
Packit |
1470ea |
"Heap allocation functions accounted for 90.4% of measured spacetime\n"
|
|
Packit |
1470ea |
"\n"
|
|
Packit |
1470ea |
"Called from:\n"
|
|
Packit |
1470ea |
" 28.8% : 0x6BF83A: gdk_pixbuf_new (in /usr/lib/libgdk_pixbuf-2.0.so.0.400.9)\n"
|
|
Packit |
1470ea |
"\n"
|
|
Packit |
1470ea |
" 6.1% : 0x5A32A5: g_strdup (in /usr/lib/libglib-2.0.so.0.400.6)\n"
|
|
Packit |
1470ea |
"\n"
|
|
Packit |
1470ea |
" 5.9% : 0x510B3C: (within /usr/lib/libfreetype.so.6.3.7)\n"
|
|
Packit |
1470ea |
"\n"
|
|
Packit |
1470ea |
" 3.5% : 0x2A4A6B: __gconv_open (in /lib/tls/libc-2.3.3.so)\n"
|
|
Packit |
1470ea |
" "
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-massif.xml:77(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"The line with the '=' signs indicates how far down the stack trace we are, "
|
|
Packit |
1470ea |
"in this case we are at the top. After this it lists the heaviest users of "
|
|
Packit |
1470ea |
"memory in order of decreasing spacetime. Spacetime is the product of the "
|
|
Packit |
1470ea |
"amount of memory used and how long it was used for. It corresponds to the "
|
|
Packit |
1470ea |
"area of the bands in the graph. This part of the file tells us what we "
|
|
Packit |
1470ea |
"already know: most of the spacetime is dedicated to gdk_pixbuf_new. To find "
|
|
Packit |
1470ea |
"out what called gdk_pixbuf_new we need to search further down the text file:"
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-massif.xml:80(programlisting)
|
|
Packit |
1470ea |
#, no-wrap
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"\n"
|
|
Packit |
1470ea |
"== 4 ===========================\n"
|
|
Packit |
1470ea |
"Context accounted for 28.8% of measured spacetime\n"
|
|
Packit |
1470ea |
" 0x6BF83A: gdk_pixbuf_new (in /usr/lib/libgdk_pixbuf-2.0.so.0.400.9)\n"
|
|
Packit |
1470ea |
" 0x3A998998: (within /usr/lib/gtk-2.0/2.4.0/loaders/libpixbufloader-png.so)\n"
|
|
Packit |
1470ea |
" 0x6C2760: (within /usr/lib/libgdk_pixbuf-2.0.so.0.400.9)\n"
|
|
Packit |
1470ea |
" 0x6C285E: gdk_pixbuf_new_from_file (in /usr/lib/libgdk_pixbuf-2.0.so.0.400.9)\n"
|
|
Packit |
1470ea |
"\n"
|
|
Packit |
1470ea |
"Called from:\n"
|
|
Packit |
1470ea |
" 27.8% : 0x804C1A3: load_scenario (same-gnome.c:463)\n"
|
|
Packit |
1470ea |
"\n"
|
|
Packit |
1470ea |
" 0.9% : 0x3E8095E: (within /usr/lib/libgnomeui-2.so.0.792.0)\n"
|
|
Packit |
1470ea |
"\n"
|
|
Packit |
1470ea |
" and 1 other insignificant place\n"
|
|
Packit |
1470ea |
" "
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-massif.xml:95(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"The first line tells us we are now four levels deep into the stack. Below it "
|
|
Packit |
1470ea |
"is a listing of the function calls that leads from here to gdk_pixbuf_new. "
|
|
Packit |
1470ea |
"Finally there is a list of functions that are at the next level down and "
|
|
Packit |
1470ea |
"call these functions. There are, of course, also entries for levels 1, 2, "
|
|
Packit |
1470ea |
"and 3, but this is the first level to reach right down through the GDK code "
|
|
Packit |
1470ea |
"to the <application>Same GNOME</application> code. From this listing, we can "
|
|
Packit |
1470ea |
"see instantly that the problem code is load_scenario."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-massif.xml:98(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"Now that we know what part of our code is using all the spacetime we can "
|
|
Packit |
1470ea |
"look at it and find out why. It turns out that the load_scenario is loading "
|
|
Packit |
1470ea |
"a pixbuf from file and then never freeing that memory. Having identified the "
|
|
Packit |
1470ea |
"problem code, we can start to fix it."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-massif.xml:103(title)
|
|
Packit |
1470ea |
msgid "Acting on the Results"
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-massif.xml:104(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"Reducing spacetime consumption is good, but there are two ways of reducing "
|
|
Packit |
1470ea |
"it and they are not equal. You can either reduce the amount of memory "
|
|
Packit |
1470ea |
"allocated, or reduce the amount of time it is allocated for. Consider for a "
|
|
Packit |
1470ea |
"moment a model system with only two processes running. Both processes use up "
|
|
Packit |
1470ea |
"almost all the physical RAM and if they overlap at all then the system will "
|
|
Packit |
1470ea |
"swap and everything will slow down. Obviously if we reduce the memory usage "
|
|
Packit |
1470ea |
"of each process by a factor of two then they can peacefully coexist without "
|
|
Packit |
1470ea |
"the need for swapping. If instead we reduce the time the memory is allocated "
|
|
Packit |
1470ea |
"by a factor of two then the two programs can coexist, but only as long as "
|
|
Packit |
1470ea |
"their periods of high memory use don't overlap. So it is better to reduce "
|
|
Packit |
1470ea |
"the amount of memory allocated."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-massif.xml:107(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"Unfortunately, the choice of optimization is also constrained by the needs "
|
|
Packit |
1470ea |
"of the program. The size of the pixbuf data in <application>Same GNOME</"
|
|
Packit |
1470ea |
"application> is determined by the size of the game's graphics and cannot be "
|
|
Packit |
1470ea |
"easily reduced. However, the amount of time it spends loaded into memory can "
|
|
Packit |
1470ea |
"be drastically reduced.
|
|
Packit |
1470ea |
"optimized\"/> shows the <application>Massif</application> analysis of "
|
|
Packit |
1470ea |
"<application>Same GNOME</application> after being altered to dispose of the "
|
|
Packit |
1470ea |
"pixbufs once the images have been loaded into the X server."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-massif.xml:111(title)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"<application>Massif</application> output for the optimized <application>Same "
|
|
Packit |
1470ea |
"GNOME</application> program."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
"优化后的 <application>Same GNOME</application> 程序的 <application>Massif</"
|
|
Packit |
1470ea |
"application> 输出。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-massif.xml:118(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"The spacetime use of gdk_pixbuf_new is now a thin band that only spikes "
|
|
Packit |
1470ea |
"briefly (it is now the sixteenth band down and shaded magenta). As a bonus, "
|
|
Packit |
1470ea |
"the peak memory use has dropped by 200 kB since the spike occurs before "
|
|
Packit |
1470ea |
"other memory is allocated. If two processes like this where run together the "
|
|
Packit |
1470ea |
"chances of the peak memory usage coinciding, and hence the risk of swapping, "
|
|
Packit |
1470ea |
"would be quite low."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-massif.xml:121(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"Can we do better ? A quick examination of <application>Massif</"
|
|
Packit |
1470ea |
"application>'s text output reveals: g_strdup to be the new major offender."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
"我们可以做得更好吗?快速检查 <application>Massif</application> 的文本输出揭"
|
|
Packit |
1470ea |
"示:g_strdup 是新的主犯。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-massif.xml:124(programlisting)
|
|
Packit |
1470ea |
#, no-wrap
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"\n"
|
|
Packit |
1470ea |
"Command: ./same-gnome \n"
|
|
Packit |
1470ea |
"\n"
|
|
Packit |
1470ea |
"== 0 ===========================\n"
|
|
Packit |
1470ea |
"Heap allocation functions accounted for 87.6% of measured spacetime\n"
|
|
Packit |
1470ea |
"\n"
|
|
Packit |
1470ea |
"Called from:\n"
|
|
Packit |
1470ea |
" 7.7% : 0x5A32A5: g_strdup (in /usr/lib/libglib-2.0.so.0.400.6)\n"
|
|
Packit |
1470ea |
"\n"
|
|
Packit |
1470ea |
" 7.6% : 0x43BC9F: (within /usr/lib/libgdk-x11-2.0.so.0.400.9)\n"
|
|
Packit |
1470ea |
"\n"
|
|
Packit |
1470ea |
" 6.9% : 0x510B3C: (within /usr/lib/libfreetype.so.6.3.7)\n"
|
|
Packit |
1470ea |
"\n"
|
|
Packit |
1470ea |
" 5.2% : 0x2A4A6B: __gconv_open (in /lib/tls/libc-2.3.3.so)\n"
|
|
Packit |
1470ea |
" "
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-massif.xml:139(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"If we look closer though we see that it is called from many, many, places."
|
|
Packit |
1470ea |
msgstr "如果我们更自习的查看,我们发现它从很多很多地方调用。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-massif.xml:142(programlisting)
|
|
Packit |
1470ea |
#, no-wrap
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"\n"
|
|
Packit |
1470ea |
"== 1 ===========================\n"
|
|
Packit |
1470ea |
"Context accounted for 7.7% of measured spacetime\n"
|
|
Packit |
1470ea |
" 0x5A32A5: g_strdup (in /usr/lib/libglib-2.0.so.0.400.6)\n"
|
|
Packit |
1470ea |
"\n"
|
|
Packit |
1470ea |
"Called from:\n"
|
|
Packit |
1470ea |
" 1.8% : 0x8BF606: gtk_icon_source_copy (in /usr/lib/libgtk-x11-2.0.so.0.400.9)\n"
|
|
Packit |
1470ea |
"\n"
|
|
Packit |
1470ea |
" 1.1% : 0x67AF6B: g_param_spec_internal (in /usr/lib/libgobject-2.0.so.0.400.6)\n"
|
|
Packit |
1470ea |
"\n"
|
|
Packit |
1470ea |
" 0.9% : 0x91FCFC: (within /usr/lib/libgtk-x11-2.0.so.0.400.9)\n"
|
|
Packit |
1470ea |
"\n"
|
|
Packit |
1470ea |
" 0.8% : 0x57EEBF: g_quark_from_string (in /usr/lib/libglib-2.0.so.0.400.6)\n"
|
|
Packit |
1470ea |
"\n"
|
|
Packit |
1470ea |
" and 155 other insignificant places\n"
|
|
Packit |
1470ea |
" "
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-massif.xml:158(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"We now face diminishing returns for our optimization efforts. The graph "
|
|
Packit |
1470ea |
"hints at another possible approach: Both the \"other\" and \"heap admin\" "
|
|
Packit |
1470ea |
"bands are quite large. This tells us that there are a lot of small "
|
|
Packit |
1470ea |
"allocations are being made from a variety of places. Eliminating these will "
|
|
Packit |
1470ea |
"be difficult, but if they can be grouped then the individual allocations can "
|
|
Packit |
1470ea |
"be larger and the \"heap admin\" overhead can be reduced."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-massif.xml:163(title)
|
|
Packit |
1470ea |
msgid "Caveats"
|
|
Packit |
1470ea |
msgstr "注意事项"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-massif.xml:164(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"There are a couple of things to watch out for: Firstly, spacetime is only "
|
|
Packit |
1470ea |
"reported as a percentage, you have to compare it to the overall size of the "
|
|
Packit |
1470ea |
"program to decide if the amount of memory is worth pursuing. The graph, with "
|
|
Packit |
1470ea |
"its kilobyte vertical axis, is good for this."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-massif.xml:167(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"Secondly, <application>Massif</application> only takes into account the "
|
|
Packit |
1470ea |
"memory used by your own program. Resources like pixmaps are stored in the X "
|
|
Packit |
1470ea |
"server and aren't considered by <application>Massif</application>. In the "
|
|
Packit |
1470ea |
"<application>Same GNOME</application> example we have actually only moved "
|
|
Packit |
1470ea |
"the memory consumption from client-side pixbufs to server-side pixmaps. Even "
|
|
Packit |
1470ea |
"though we cheated there are performance gains. Keeping the image data in the "
|
|
Packit |
1470ea |
"X server makes the graphics routines quicker and removes a lot of inter-"
|
|
Packit |
1470ea |
"process communication. Also, the pixmaps will be stored in a native graphics "
|
|
Packit |
1470ea |
"format which is often more compact than the 32-bit RGBA format used by "
|
|
Packit |
1470ea |
"gdk_pixbuf. To measure the effect of pixmaps, and other X resources use the "
|
|
Packit |
1470ea |
"
|
|
Packit |
1470ea |
"\">xrestop</ulink> program."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-harmful.xml:3(title)
|
|
Packit |
1470ea |
msgid "Disk Seeks Considered Harmful"
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-harmful.xml:5(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"Disk seeks are one of the most expensive operations you can possibly "
|
|
Packit |
1470ea |
"perform. You might not know this from looking at how many of them we "
|
|
Packit |
1470ea |
"perform, but trust me, they are. Consequently, please refrain from the "
|
|
Packit |
1470ea |
"following suboptimal behavior:"
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
"磁盘寻道是您可能遇到的最昂贵的操作之一。从查看执行的数量,可能不能了解到,但"
|
|
Packit |
1470ea |
"这是真的。相应地,请避免如下次优的选择:"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-harmful.xml:10(para)
|
|
Packit |
1470ea |
msgid "Placing lots of small files all over the disk."
|
|
Packit |
1470ea |
msgstr "在磁盘中到处存放很多小文件。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-harmful.xml:15(para)
|
|
Packit |
1470ea |
msgid "Opening, stating, and reading lots of files all over the disk"
|
|
Packit |
1470ea |
msgstr "在磁盘中,到处打开、查看、读取很多小文件。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-harmful.xml:20(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"Doing the above on files that are laid out at different times, so as to "
|
|
Packit |
1470ea |
"ensure that they are fragmented and cause even more seeking."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-harmful.xml:25(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"Doing the above on files that are in different directories, so as to ensure "
|
|
Packit |
1470ea |
"that they are in different cylinder groups and and cause even more seeking."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-harmful.xml:30(para)
|
|
Packit |
1470ea |
msgid "Repeatedly doing the above when it only needs to be done once."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-harmful.xml:35(para)
|
|
Packit |
1470ea |
msgid "Ways in which you can optimize your code to be seek-friendly:"
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-harmful.xml:40(para)
|
|
Packit |
1470ea |
msgid "Consolidate data into a single file."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-harmful.xml:45(para)
|
|
Packit |
1470ea |
msgid "Keep data together in the same directory."
|
|
Packit |
1470ea |
msgstr "将数据保持在同一个目录中。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-harmful.xml:50(para)
|
|
Packit |
1470ea |
msgid "Cache data so as to not need to reread constantly."
|
|
Packit |
1470ea |
msgstr "缓存数据以避免定期重读数据。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-harmful.xml:55(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"Share data so as not to have to reread it from disk when each application "
|
|
Packit |
1470ea |
"loads."
|
|
Packit |
1470ea |
msgstr "共享数据以便不必每个程序需要时都从硬盘读取。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-harmful.xml:60(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"Consider caching all of the data in a single binary file that is properly "
|
|
Packit |
1470ea |
"aligned and can be mmaped."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
"考虑将所有的数据缓存在单个二进制文件中,并使文件正确对齐并可以将其 mmap。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-harmful.xml:65(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"The trouble with disk seeks are compounded for reads, which is unfortunately "
|
|
Packit |
1470ea |
"what we are doing. Remember, reads are generally synchronous while writes "
|
|
Packit |
1470ea |
"are asynchronous. This only compounds the problem, serializing each read, "
|
|
Packit |
1470ea |
"and contributing to program latency."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-guide.xml:5(title)
|
|
Packit |
1470ea |
msgid "Optimizing GNOME Software"
|
|
Packit |
1470ea |
msgstr "优化 GNOME 软件"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-guide.xml:8(publishername) C/optimization-guide.xml:56(para)
|
|
Packit |
1470ea |
msgid "GNOME Documentation Project"
|
|
Packit |
1470ea |
msgstr "GNOME 文档项目"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-guide.xml:11(year) C/optimization-guide.xml:15(year)
|
|
Packit |
1470ea |
msgid "2004-2005"
|
|
Packit |
1470ea |
msgstr "2004-2005"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-guide.xml:12(holder)
|
|
Packit |
1470ea |
msgid "Callum McKenzie"
|
|
Packit |
1470ea |
msgstr "Callum McKenzie"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-guide.xml:16(holder)
|
|
Packit |
1470ea |
msgid "Robert Love"
|
|
Packit |
1470ea |
msgstr "Robert Love"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-guide.xml:20(firstname)
|
|
Packit |
1470ea |
msgid "Callum"
|
|
Packit |
1470ea |
msgstr "Callum"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-guide.xml:21(surname)
|
|
Packit |
1470ea |
msgid "McKenzie"
|
|
Packit |
1470ea |
msgstr "McKenzie"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-guide.xml:24(firstname)
|
|
Packit |
1470ea |
msgid "Robert"
|
|
Packit |
1470ea |
msgstr "Robert"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-guide.xml:25(surname)
|
|
Packit |
1470ea |
msgid "Love"
|
|
Packit |
1470ea |
msgstr "Love"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-guide.xml:29(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"Permission is granted to copy, distribute and/or modify this document under "
|
|
Packit |
1470ea |
"the terms of the <citetitle>GNU Free Documentation License</citetitle>, "
|
|
Packit |
1470ea |
"Version 1.1 or any later version published by the Free Software Foundation "
|
|
Packit |
1470ea |
"with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. "
|
|
Packit |
1470ea |
"You may obtain a copy of the <citetitle>GNU Free Documentation License</"
|
|
Packit |
1470ea |
"citetitle> from the Free Software Foundation by visiting
|
|
Packit |
1470ea |
"\" url=\"http://www.fsf.org\">their Web site</ulink> or by writing to: Free "
|
|
Packit |
1470ea |
"Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-"
|
|
Packit |
1470ea |
"1307, USA."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-guide.xml:41(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"Many of the names used by companies to distinguish their products and "
|
|
Packit |
1470ea |
"services are claimed as trademarks. Where those names appear in any GNOME "
|
|
Packit |
1470ea |
"documentation, and those trademarks are made aware to the members of the "
|
|
Packit |
1470ea |
"GNOME Documentation Project, the names have been printed in caps or initial "
|
|
Packit |
1470ea |
"caps."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-guide.xml:52(revnumber)
|
|
Packit |
1470ea |
msgid "0.1"
|
|
Packit |
1470ea |
msgstr "0.1"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-guide.xml:53(date)
|
|
Packit |
1470ea |
msgid "November 2007"
|
|
Packit |
1470ea |
msgstr "2007年11月"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-guide.xml:55(para)
|
|
Packit |
1470ea |
msgid "William Johnston"
|
|
Packit |
1470ea |
msgstr "William Johnston"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-guide.xml:57(para)
|
|
Packit |
1470ea |
msgid "Intial conversion to docbook format."
|
|
Packit |
1470ea |
msgstr "初始转换到 docbook 格式。"
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#: C/optimization-guide.xml:63(para)
|
|
Packit |
1470ea |
msgid ""
|
|
Packit |
1470ea |
"Software can be optimized in many ways: for speed, program size, or memory "
|
|
Packit |
1470ea |
"use. This section contains guides and tutorials for optimizing your software."
|
|
Packit |
1470ea |
msgstr ""
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#. Put one translator per line, in the form of NAME <EMAIL>, YEAR1, YEAR2
|
|
Packit |
1470ea |
#: C/optimization-guide.xml:0(None)
|
|
Packit |
1470ea |
msgid "translator-credits"
|
|
Packit |
1470ea |
msgstr "YunQiang Su <wzssyqa@gmail.com>, 2010"
|