我应该多久创建一个类的新实例?

时间:2011-03-23 20:18:58

标签: php design-patterns

我不是一个“死硬”的程序员,我需要一些建议。

我正在开发一个用户可以搜索商店或品牌的网站。

我创建了一个名为搜索商店的课程。

搜索执行有两种方式:“jQuery Live Search”“普通搜索”

为超过2个字符输入的每个字符触发实时搜索。因此,如果输入5个字符,则会执行3次搜索。如果您要查找的商店位于下拉列表中,则可以单击商店并加载商店页面。

另一种搜索是在您输入3个或更多字符后单击搜索按钮。

每次执行搜索时,都会执行以下代码

$search = new Search();
$result = $search->search($_GET);

每次加载商店页面时都会执行$store = new Store()

我的问题是:

我们假设我的网站非常成功,每小时我有100个用户。每个用户至少搜索3次并查看至少5个商店。

这意味着每小时创建300到900个搜索对象和500个商店对象。

创建这么多新对象是不好还是好?

我已经阅读了一些关于Singleton的内容,但有很多建议反对这一点。

我应该怎样做才能达到最佳性能?我应该使用的任何特定设计模式?

3 个答案:

答案 0 :(得分:3)

我认为创建课程不会成为您网站的瓶颈。查看像Zend Framework一样的MVC框架,并检查为每个调用生成多少个类实例。创建类实例的开销几乎没有,搜索会给你的数据库带来热量(假设你使用像mysql这样的数据库)。

我建议在用户停止输入更多字符后,使用jQuery Live搜索的计时器进行搜索。就像每次输入一个角色时计时器一样刷新,当计时器触发时你可以实际搜索。

我认为一个更大的问题将是你的数据库。如果你有很多阅读请求,像memcache这样的好缓存层可能会从你的数据库中获得很大的负载。

优化搜索数据库应该是保持高性能的好方法。为了充分利用您正在使用的数据库,需要遵循许多调整和最佳实践。

正如prodigitalson的评论建议潜入Lucene全文搜索甚至比调整数据库更有效。

如果Lucene对您来说有点开销,您可能需要查看Zend_Search_Lucene组件,该组件执行相同的工作并以php编写。

答案 1 :(得分:3)

不要通过猜测性能瓶颈来使设计过度复杂化。创建的对象数很少会成为问题。

如果您需要稍后进行优化,则memcached层可以为您提供帮助。

答案 2 :(得分:0)

即使您需要对这些对象的尺寸进行一些关注,创建大量对象也不应该是应用程序中的性能问题。

不要过多地使你的设计复杂化,但我认为单例模式不是一个复杂因素,并且实现起来并不困难。

因此,如果相同的对象实例可以在同一用户(甚至不同的用户,如果可能在您的应用程序逻辑中)的不同搜索中重复使用多次,那么不要害怕使用单例。它可以节省您的内存,并防止您执行与执行相同任务的多个对象实例相关的错误,最终共享资源。