将所有代码更改为面向对象会使内存使用更大还是更小?

时间:2009-05-21 18:47:22

标签: php oop

有一个用PHP编写的项目,只是简单的所有程序......一步一步地调用DB函数,处理和打印输出。然后它被改为完全面向对象 - App对象有一个单例,并且通过App对象调用各种函数。

有人声称服务器上的内存使用量或占用空间会减少。会是这样的吗?我认为程序通常只使用极小的,而面向对象的编程与各种设计模式通常实例化的东西比需要的多,或者只是有程序,而程序通常只有极小的。

那么将所有代码更改为面向对象实际上会使服务器上的内存使用量变小吗?

8 个答案:

答案 0 :(得分:9)

它可能会让它变得更多,但实在没有办法说出来。如果您的代码通过OOP方式实际改进,那么它可能会更少。在使用的存储器和面向对象的存在之间没有直接的相关性。也许一般来说,面向对象需要更多的内存,但只有在两组代码编写得同样好的情况下,并且几乎不会出现这种情况。

是否有理由将此应用程序升级为面向对象?你知道它不是其中之一,你可以混合搭配...... OOP不是银弹。

答案 1 :(得分:6)

不幸的是,我也完成了我的测试。我做了测试速度,它大致相同,但是在测试内存使用情况下获取PHP中的memory_get_usage()时,我在OOP端看到了一个非常大的数字。

对于程序,

116,576字节用于OOP到18,856字节。我知道“硬件便宜”,但加油!使用量增加1,000%?对不起,这不是最佳选择。有这么多用户同时访问您的网站,我确信您的RAM只会燃烧或耗尽。我错了吗?

基本上,我从我所有的OOP粉丝那里听到的是......你将使用更多资源,它将与编写良好的程序函数调用一样快,但对于大型项目和多个项目来说它会更好开发者环境。需要找到平衡点。

更多开发者(草率开发者)和更大的网站

Con:用于您的应用的更多RAM。

Pro:在整个应用程序中很容易维护代码。

有一个简单网站的开发者

Con:如果您的网站增长,或者开始包含许多开发人员,如果您的程序代码很糟糕,开发可能会慢一点。

Pro:低RAM,速度稍快。如果您的代码写得正确(只有优秀的开发人员可以这样做 - 哈哈),您的代码将同样易于维护。

在RAM战争中,程序获胜。在可维护性战争中,良好的代码获胜。 ;)

OOP粉丝说OOP更清洁。我已经看到了一些非常混乱的OOP代码,然后我看到了一些真正干净的过程代码,由开发人员编写,可以编写任何语言或风格的优秀代码。能够与之合作的代码。最重要的是,如果你有邋developer的开发人员,你使用哪种风格并不重要,你会有邋code的代码。

由于我自己的个人基准测试,我选择了内存耗费OOP,主要是因为我写的是非常干净的程序,而且我通常是我项目中唯一的开发者。

干杯!

答案 2 :(得分:3)

你的问题对我来说听起来像这样:我们有一个不可维护的代码库,会用Java重写它会让它更快吗?

首先,您需要确定问题:您的代码是不可读和/或难以维护的,还是您的程序运行时占用空间太大?这是两个完全不同的问题。

如果你有一个难以维护的代码库(听起来像你这样做),你将无法通过使用另一种范例重写代码来解决这个问题。为什么代码不可读?开发人员编写不可读的代码,然后用Java或C#重写它只会给你面向对象的不可读代码。在这种情况下,您需要提高开发人员的技能(雇用更好的技能,重新培训现有技术等)。

如果您遇到内存占用问题,那么您应该将其视为任何其他性能问题。首先衡量,然后进行一些优化(重写一段代码以提高内存效率),然后再次测量。在之前进行测量非常重要,以确保您不会让事情变得更糟。相信我,即使是非常优秀的程序员也会犯错误。

答案 3 :(得分:1)

  

然后它完全改变了   面向对象 - 有一个   App对象的单例,和   通过调用各种函数   App对象。

实际上听起来就像“完全面向对象”的相反。这表明对“面向对象”意味着什么的理解水平很可能不会导致内存占用减少。

一般来说,设计对内存占用的影响远远大于编程范例,尽管平均,面向对象的应用程序往往具有更大的占用空间。< / p>

答案 4 :(得分:1)

除了其他评论之外,我想说OO有助于减少冗余......这可能会使您的代码更有效,并减少内存占用。当然,OO有更多的开销,但是应该在更大的项目中更有效率。

答案 5 :(得分:1)

内存使用不是OO的优势。 OO的优点是代码将变得更易于维护。如果您没有遇到性能问题,则无需寻找提高效率的方法。

答案 6 :(得分:1)

答案是肯定和否定。

通过切换到更加面向对象的体系结构,可以减少内存占用,但是当且仅当代码更有效时。

没有任何函数调用或对象调用的直接PHP非常快。一旦你开始进行函数调用或对象调用,事情开始变慢。

A Python Vs Ruby Vs. Python Benchmark开始,执行增量循环的OO策略耗时3.7079秒,面向函数需要4.3501秒,并且使用时间均为0.6164秒。使用OO与Procedural Vs做一个简单的“Hello World”应用程序。两者都不是4.1248秒,而是3.7656 vs 0.9309秒。

因此,根据您的代码正在做什么以及它是如何进行的,对象可能更快或更慢,内存密集程度更高或内存密集程度更低,或者两者都没有。

答案 7 :(得分:0)

代码1:OOP

<?php
$a = microtime(true);

class Fruit {
    public $name;
  
    function set_name($name) {
      echo memory_get_usage()."<br>";
      $this->name = $name;
    }

    function get_name() {
      echo memory_get_usage()."<br>";
      return $this->name;
    }
  
}

$fruit = new Fruit();
$fruit -> set_name("A");
echo $fruit -> get_name()."<br>";

echo memory_get_usage()."<br>";
echo microtime(true)-$a;
?>

代码2:程序

<?php

$a = microtime(true);

function set_name($name) {
    echo memory_get_usage()."<br>";
    return $name;
  }

  function get_name($input) {
    echo memory_get_usage()."<br>";
    return $input;
  }

$fruit = set_name("A");
echo get_name($fruit)."<br>";

echo memory_get_usage()."<br>";
echo microtime(true)-$a;

?>
Output 1 OOP :
395168
395168
A
395168
1.8119812011719E-5

Output 2 Procedural :
394104
394104
A
394104
1.0967254638672E-5

XAMPP , PHP Version 7.3.1 , Windows NT 10.0 build 19041 (Windows 10) i586