2011-03-23 146 views
2

我不是一个“死硬”的编码器,我需要一些建议。我应该多久创建一个类的新实例?

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

我创建了一个类,名为搜索商店

执行搜索有两种方式:“jQuery Live Search”“正常搜索”

在2个字符以上输入的每个字符都会触发实时搜索。所以如果你输入5个字符,搜索会执行3次。如果您要查找的商店位于下拉列表中,则可以点击商店,商店页面将被加载。

其他搜索是在输入3个或更多字符后单击搜索按钮时。

执行搜索时,都会将下面的代码执行

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

每个商店页面加载$store = new Store()执行时间。

我的问题是这样的:

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

这意味着300到900个搜索对象每小时创建500个存储对象。

创建如此多的新对象是不好还是不好?

我读过一些关于Singleton,但许多建议反对这一点。

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

+4

创建对象应该是最不关心的问题。我不使用PHP,但是Java和C#都可以每秒创建数十万个对象(实际上,对于最平凡的对象来说,其实数百万)。或者考虑像Python这样的语言,甚至整数是对象*(有些被缓存)。即使抛出两个因素十,你仍然很安全。所以,请。设计“良好”并*运行绩效分析*。 – 2011-03-23 20:40:34

+0

@pst非常好的一点。以表演的名义犯下了很多罪。如果你的代码编写的很好,经常重构,你将总是有一个很好的开始做性能调整。你可以做负载测试来发现瓶颈。 – 2011-03-23 20:47:54

+0

@pst - 谢谢。我只是一名前端开发人员,从来不必担心这些事情。很高兴知道创建对象不会窒息服务器。我会尽我所能设计,并在时间到时进行性能测试:) – Steven 2011-03-23 20:53:48

回答

3

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

我建议在用户停止输入更多字符后,为您的jQuery Live搜索使用计时器来执行搜索。如果每次输入一个字符和当定时器触发时刷新,你实际上可以搜索。

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

优化你的数据库搜索应该是一个很好的措施,以保持高性能。有很多的调整和最佳实践,以便充分利用你正在使用的数据库。

作为prodigitalson建议潜入全文搜索Lucene的评论甚至可能比调整db更有效。

如果Lucene对于你来说有些开销,你可能想看看Zend_Search_Lucene组件,它执行相同的工作并用php编写。

+1

要添加到此,您可能需要考虑将搜索完全从数据库中拉出来,方法是使用Lucene或其他内容对数据库中的内容进行索引类似。即使这使用了db后端,记录仍然会与主站点数据库分离,因此您可以将其移至完全不同的数据库实例或服务器。你也可能会得到更好的搜索结果... – prodigitalson 2011-03-23 20:33:14

+0

我没有chaching的经验。我发现这篇文章,http://net.tutsplus.com/tutorials/php/oo-php5-adding-caching-to-data-access-layer/。我会看看我能否实现这一点 - 除非你有更好的主意? – Steven 2011-03-23 20:35:20

+0

@prodigitalson - 这是一个很好的观点。我需要提高搜索速度。现在要慢下来。 – Steven 2011-03-23 20:37:14

3

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

如果您需要稍后优化,memcached图层可以帮助您。

+3

我基本上与Mads达成一致。过早优化是开发者的罪恶。不要把自己发展成一个洞,做个聪明的人,但是如果你遇到过这个问题,你可以跨越用户桥。 此外,为了清楚起见,您应该关注正在生成的请求数量,这听起来像是在通过AJAX键入2个字符时发生的。您的“搜索”对象是在每次请求时创建和销毁的,在这种情况下似乎极其微不足道 - 您关心的是带宽和服务器负载。 – 2011-03-23 20:46:48

0

即使您必须关注这些对象的尺寸,创建大量的对象也不应该成为应用程序中的性能问题。

不要让你的设计太复杂,但我认为singleton模式并不复杂,并不难实现。

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

相关问题