记忆与表现

时间:2009-12-13 23:18:23

标签: performance memory

编程时一直都是我的想法,所以我想在实际到达之前我会把它吐出来。

我应该更担心什么?应用程序消耗的内存或性能。我的意思是我应该专注于为应用程序使用更少的内存并使用更多的性能(例如,通过数据库加载,并在使用后转储它),或使用更少的性能和使用更多的内存(例如缓存)

我的申请条件: - 它是一个服务器应用程序,因此它不打算在桌面等上运行,我有6GB的ram,而且我有一个四核。

16 个答案:

答案 0 :(得分:14)

你的问题吸引了许多像禅宗一样的回应。我希望做得更好。

你的内存限制很难:如果超过它,即使有虚拟内存,你的应用程序也会爬行,你将成为所有人的笑柄。

你的CPU时间是无限的:你的应用程序将花费它所需的任何时间;希望它足够平行,所有4个CPU将在大多数情况下完全烹饪,直到你的应用程序完成。

许多计算机科学问题都有各种各样的解决方案,各种记忆与时间的权衡。所以:慷慨地记忆,直到你使用至少大约一半(如果这有帮助;不要浪费记忆!)但停止,而剩下足够的记忆,你不必担心超过限制,即使在特殊情况下或意外。

现在您已经分配了内存资源,您可以尝试从代码中调整一些小的性能提升。但是不要过分夸大它。

完成。

P.S。如果它不能正确可靠地工作,那么前面的所有努力都是毫无价值的。记住这一点!

祝你好运。

答案 1 :(得分:6)

考虑您将要处理的数据量以及您需要的响应能力。在设计中加入一些思考。将其构建为可维护,并使其正常工作。

然后分析并解决您的实际瓶颈。

答案 2 :(得分:4)

这实际上取决于程序的类型。如果你可以控制目标机器,它会让它更容易一些。如果你知道即使在极端情况下,你也不会耗尽内存,那么你也可以使用你想要的一切。在没有任何东西使用的记忆中没有任何优势。

总的来说,我会想到几个类别的事情。

补充程序,如果程序没有执行机器的主要用途那么它应该尝试并节省内存,虽然不是服务器的东西,我通常在这种情况下想到的例子是桌面小部件和Tomboy ..它们不是主要用途,因此他们不应从系统中获取太多资源,否则可能会影响主要应用程序的性能。

一般应用程序,这些都有简单的优先级。首先完成所需的工作,然后如果速度慢,请加快速度。除非你是蛮干的(或者使用python或java :-),否则你不需要太担心内存。

许多实例应用程序。如果您希望用户将许多应用程序实例作为多个任务或仅在同一任务中的多个实例(如多个firefox窗口/选项卡),因为事情成倍增加,您需要掌握内存使用情况。速度并不是一个让操作更快的问题,因为确保空闲实例实际上没有进行任何处理。

Jumbo应用程序,如果您的应用程序实际上有很大的任务要执行,比如说图像处理,那么您应该从一开始就考虑内存使用情况。我怀疑Evolution消耗了大量内存(目前我的机器上有142兆),因为他们有一个巨大的任务,但没有意识到。我有很多电子邮件,主要来自列表,

如果您可以控制目标环境,那么您可以根据需要拥有尽可能多的内存,这对您来说更容易。如果其他用户打算使用您的程序,则需要更多内存对您来说更容易,但对用户来说并不友好。

我正在使用OLPC XO进行开发,主要是尝试通过补充程序使系统变得更好。这意味着我真的专注于低内存使用,但即使在内存受限的系统上,我发现在进一步减少内存使用方面没有多大用处。启动后,它有超过150兆的免费。这足以运行您想要的所有轻量级应用程序,但大多数较重的应用程序将是一个压力。中间地带很少。如果您正在运行像firefox这样的应用程序,那么进一步优化2 meg应用程序只能使用一个meg并不会给你更多的肘部空间。

答案 3 :(得分:3)

  1. 让它发挥作用。
  2. 你会得到不同的答案,它真的取决于每个应用程序。除了:

    之外,没有一揽子答案涵盖所有情况
    1. 让它发挥作用。
    2. 软件可以被推翻。

      具体而言,大多数操作系统都非常擅长缓存磁盘I / O--如果你在SQLite数据库上做了很多繁重的工作,那么当你在操作中有几个连接时无论如何,系统可能会将整个东西扔进内存中。在大多数情况下,不要过度考虑操作系统。

答案 4 :(得分:2)

没有一个正确的选择 - 这取决于您的应用及其要求。但是,它通常是一个或另一个选择 - 您不能经常(如果有的话)最大限度地提高性能并减少内存消耗。如果这是任何类型的关键系统,则应由客户指定内存的最大界限和/或性能的最低界限 - 如果不是,则应该是。

答案 5 :(得分:2)

这个问题与编程本身一样古老。不幸的是,答案是“它取决于”。如果您正在为具有32 GB RAM的系统编写应用程序,并且您的软件是唯一将运行的软件,那么您应该编写代码以利用它。另一方面,如果您正在编写将在嵌入式系统上运行的代码,那么您应该尽可能少地使用内存。最重要的是,您了解这些权衡,分析您的代码,并优化最大的瓶颈。

答案 6 :(得分:1)

即使您的规格仍然存在,这仍然取决于您的应用程序将要看到的工作负载。

  • 如果您一次处理少量数据,则可以通过预取下一个N块来优化性能,从而增加内存消耗。
  • 如果您的数据相当大,它可能很快会完全填满您的主存储器并且提前读取将导致颠簸(例如,在完全处理之前向前读取强制将数据写回磁盘/数据库;然后您需要此数据回到内存中,从而强制交换这些预读值。)

因此,首先要获得应用的工作版本。然后进行分析,看看瓶颈是什么。 (过早的优化是所有邪恶的根源! - Donald E. Knuth)

答案 7 :(得分:1)

他们都很重要。您可能希望在内存中缓存某些对象,以获得更好的性能,这可能会增加内存占用。另一方面,如果您的应用程序花费大量时间进行垃圾收集(如在.net中),或者具有尚未释放内存的非托管资源,那么您将遇到性能问题

答案 8 :(得分:1)

我认为你应该努力在内存和处理器使用之间取得平衡。

如果您正在处理服务器组件,我会担心让它与多个用户一起工作。您的应用程序可以为多少用户服务?你能让更多用户使用相同的资源吗?

答案 9 :(得分:1)

您可以从吞吐量和响应时间的角度考虑性能。找到衡量这两个因素的方法,并设置系统需要处理和工作的负载类型。一旦您测量了负载下的吞吐量/响应时间,就会产生内存/处理时间(您称之为“性能”)的决策。通常,您应该尝试尽可能多地使用CPU(以获得最佳吞吐量),这样您就可以利用所有可用的内存。

答案 10 :(得分:1)

您的客户需要什么?

您应该至少知道用户将在哪个平台上运行它。您还需要了解性能要求(每秒事务数或其他事项)。对您需要的最小规格平台进行一些保守的估计,然后进行设计。

您的帖子中似乎也有点混乱 - 如果目的是将其用于缓存,那么使用较少的内存并不是最终目标(即您实际上是使用保存的内存来提高性能)。在这种情况下,为每个开发人员每小时提供最多的东西。

答案 11 :(得分:1)

最好不要抽象地考虑它,而是从具体设计的角度考虑。

  1. 如果你的RAM用完了,你会很抱歉,所以尽量保持你的数据结构干净简单,即使看起来你可能需要编写一些看似效率低下的循环。由于担心性能而使代码和数据结构复杂化是过早优化的本质。并且,尽管人们反对过早优化并且声称他们不这样做,但他们无论如何都会这样做,达到一个可怕的程度。

  2. 当它正在工作并执行您需要它做的事情时,如果您确实遇到一个或多个性能问题,那么就处理性能问题。通常的方法是使用分析工具,但this is the method I prefer

  3. 小心多核。并行性和线程允许您使多个代理在时间上重叠,例如磁头,CPU或人类客户端。例如,如果您的进程受I / O限制,那么尝试在多个内核上执行它们将无济于事并可能会受到影响。如果只有一个物理磁盘驱动器,尝试重叠I / O绑定线程可能无法获得太多收益,并且可能会受到影响。另一方面,如果你有一个每个用户的线程,这可能是有道理的,因为这些线程花费大部分时间等待用户。

答案 12 :(得分:1)

现在,我在当前项目中遇到了同样的困境。包括三个方面:可读性速度记忆力。在我拥有的替代解决方案和库中,每一个都在一个领域很好。我的结论是(降序排列):

  • 可读性(良好的语法和逻辑)
  • 内存(将事物的内存限制为 RAM 的 1%)
  • 速度(越多越好)

主要目的是编写面向未来的代码。代码有一种生存、生存和繁荣的冲动。没有什么比好的、简单的代码更胜一筹了:优美的语法、易于遵循的逻辑和直观的步骤。选择最易读的代码。

服务和应用程序按顺序共享 CPU:通过一个接一个地运行,并且通常有许多微秒的空闲和等待。它们并行共享 RAM:都共享内存。

实施一个解决方案,确保在实际情况下内存永远不会超过限制。记住操作系统和其他应用程序与您共享内存。对于您的应用程序来说,几个百分比的 RAM 应该足够了。 然后你可以考虑解决种子瓶颈(太多循环或太多等待)。

答案 13 :(得分:0)

这取决于很多因素。这两个中哪一个会先限制?其他应用程序是否需要在同一台服务器上运行?哪个更难扩展?

答案 14 :(得分:0)

取决于

提出有形的问题!

编辑:如果您考虑在设计阶段进行缓存,那么将重新开始再次启动(缓存为总是妥协的解决方案)!

答案 15 :(得分:0)

就像其他人已经指出的那样,这仅取决于您的应用程序的要求。处理大数据时,您可能不会在程序初始加载时将所有内容都加载到RAM中。

最好从一开始就根据硬件要求设计程序。重构需要大量时间,尤其是在大型程序中!

我将列出您可以采用的不同方法以及优点和缺点,以便您轻松做出决定。

方法

1-是最高评分
3-最差的评分

1)首先通过ORM将巨大的对象(整个数据库)加载到RAM中。

初始加载时间:3
初始加载后的性能:1
RAM需求:3

评论:

初始加载后的性能:

  • 在执行初始数据库查询+ ORM之后,不再需要查询数据库。

备注:

  • 可能使用MVVMC
  • 不适用于具有大数据的应用程序。

2)仅在需要时才获取数据并使用ORM

初始加载时间:1/2
初始负载后的性能:3
RAM需求:2

评论:

初始加载时间:

  • 1或2,取决于是否使用MVVMC
  • 使用MVVMC时,必须创建Model和ViewModel对象。
    初始加载后的性能:
  • 数据库查询

RAM要求:

  • 使用MVVMC时,必须创建Model和ViewModel对象。
  • 由于ORM而导致的临时数据RAM需求

备注:

  • 可以使用MVVMC

3)仅获取所需数据,不使用ORM,而是使用功能性编程

初始加载时间:1
初始负载后的性能:3
RAM需求:1

评论:

初始加载后的性能:

  • 数据库查询

备注:

  • 在通过MVVMC使用功能性编程样式并因此直接填充视图时很有用。
  • 更多数据库查询代码