我不是一个“死硬”的程序员,我需要一些建议。
我正在开发一个用户可以搜索商店或品牌的网站。
我创建了一个名为搜索和商店的课程。
搜索执行有两种方式:“jQuery Live Search”和“普通搜索”。
为超过2个字符输入的每个字符触发实时搜索。因此,如果输入5个字符,则会执行3次搜索。如果您要查找的商店位于下拉列表中,则可以单击商店并加载商店页面。
另一种搜索是在您输入3个或更多字符后单击搜索按钮。
每次执行搜索时,都会执行以下代码
$search = new Search();
$result = $search->search($_GET);
每次加载商店页面时都会执行$store = new Store()
。
我的问题是:
我们假设我的网站非常成功,每小时我有100个用户。每个用户至少搜索3次并查看至少5个商店。
这意味着每小时创建300到900个搜索对象和500个商店对象。
创建这么多新对象是不好还是好?
我已经阅读了一些关于Singleton
的内容,但有很多建议反对这一点。
我应该怎样做才能达到最佳性能?我应该使用的任何特定设计模式?
答案 0 :(得分:3)
我认为创建课程不会成为您网站的瓶颈。查看像Zend Framework一样的MVC框架,并检查为每个调用生成多少个类实例。创建类实例的开销几乎没有,搜索会给你的数据库带来热量(假设你使用像mysql这样的数据库)。
我建议在用户停止输入更多字符后,使用jQuery Live搜索的计时器进行搜索。就像每次输入一个角色时计时器一样刷新,当计时器触发时你可以实际搜索。
我认为一个更大的问题将是你的数据库。如果你有很多阅读请求,像memcache这样的好缓存层可能会从你的数据库中获得很大的负载。
优化搜索数据库应该是保持高性能的好方法。为了充分利用您正在使用的数据库,需要遵循许多调整和最佳实践。
正如prodigitalson的评论建议潜入Lucene全文搜索甚至比调整数据库更有效。
如果Lucene对您来说有点开销,您可能需要查看Zend_Search_Lucene组件,该组件执行相同的工作并以php编写。
答案 1 :(得分:3)
不要通过猜测性能瓶颈来使设计过度复杂化。创建的对象数很少会成为问题。
如果您需要稍后进行优化,则memcached层可以为您提供帮助。
答案 2 :(得分:0)
即使您需要对这些对象的尺寸进行一些关注,创建大量对象也不应该是应用程序中的性能问题。
不要过多地使你的设计复杂化,但我认为单例模式不是一个复杂因素,并且实现起来并不困难。
因此,如果相同的对象实例可以在同一用户(甚至不同的用户,如果可能在您的应用程序逻辑中)的不同搜索中重复使用多次,那么不要害怕使用单例。它可以节省您的内存,并防止您执行与执行相同任务的多个对象实例相关的错误,最终共享资源。