0

我正在构建一种在服务器端使用 PHP 和 jQuery 以及在 javascript 中自定义 MVC 的项目管理工具。

我有一个弹出窗口来帮助用户在项目中添加人员。在它弹出的地方,用户必须选择一个组(比如说一个学生组),然后他可以选择配置文件以将它们添加到当前项目中。

我已经对 70-120 人的小组进行了测试,它可以工作,但有一点延迟。

但是当我测试一大群 1,000 人时,刷新时间太长,以至于 Chrome 会问我是要停止脚本还是等待更多时间……这对 iser 体验不好!!!

数据以 JSON 格式来自服务器:

{"users": [ { "uid" : "cortes", "firstname" : "Francois", "lastname" : "CORTES", "mail" : "..." } ], /* 1000 个用户记录更多 * / }

并且数据在此 HTML 中格式化(自定义伪 Mustache 模板)

<li>
  <div class="wrapper">
    <p class="title"> {{firstname}} {{lastname}} {{mail}} </p>
    <p> {{uid}} </p>
    <p> <input type="checkbox" id="select-{{uid}}" /> </p>
  </div>
</li>

jQuery 用于构建列表并添加一些侦听器 - 在弹出验证之前选择/取消选择状态本地存储 - 在每个列表元素上悬停鼠标时的一种突出显示 [代码] [代码] 我的问题是如何跟踪性能泄漏和如何修理它 ?

当然,代码有点丑陋且难以维护,当然我必须再次快速解决这个问题......有人可以帮助我吗?

编辑:感谢您的评论和帖子。

多一点解释:通常团体有 50-200 人。1000人的团队只是90%的合并,是临时的,由于一些技术和管理的原因。但是强制执行性能和确保 UI 的反应性是一个巨大的挑战。

暂时没有通过测试...

@Chris:我正在用 PHP 构建一个测试控制器来计时 JSON 的生成和大小

@Dandavis:是的,目前我这样做。我使用 jQuery 从页面中获取通用 DIV 模板,并在 JSON 数据上循环 1,000 次,javascript 字符串将通配符 {{example-data-name}} 替换为其示例数据值,然后将其插入 DOM( jQuery)然后我绑定事件侦听器(jQuery 也是)...丑陋的代码,我同意,但是自制的,没有办法也没有时间使用 BackBone 或 Knockout 重构它...

文档片段?嗯...需要进一步挖掘!

@ajax81:页面加载时缓存的静态 JSON ??? 为什么不...也许是修改现有工作和努力的最简单方法!

@Alberto:我记住的有用提示。正如我上面评论的,我今天下午开始测试

我的感觉是 PHP 正确地完成了它的工作(关于数据大小和生成速度),但是 m 自定义模板方法不能有效地处理整个数据!

无需对数据进行分页,因为用户通常会在小 (50) 到中 (120) 记录列表中滚动。1000 是压力测试。它只发生在夏季(节假日),但如果我能成功,用户的日常体验会更好,并且不会在低性能系统上崩溃。

问候。

编辑并解决问题

PHP

我已经对 thz PHP 脚本进行了基准测试:1,000 条记录提取和 JSON 生成不到 0.25 秒的执行时间和不到 100ko 长......所以服务器端没有特别的问题。

我在服务器端进行了一些优化,通过使用一些 PHP 内缓存来限制数据库和 LDAP 请求,只是为了限制来自我的应用程序的冗余和网络流量。

Javascript

然后我修改了模板用法:现在我循环 1,000 条 JSON 记录,评估模板并将结果附加到原始 HTML 字符串中,然后将 LI 元素附加到 UL。

此时,此列表已为用户直观地准备好。

后来我再次循环 JSON 数据以绑定事件处理程序(单击复选框,单击周围的 DIV,并用指针悬停该 DIV...),但列表尚未显示!

刷新列表的延迟是可见的,但非常短暂,不到 1.5 秒......也许我会添加一些沙漏图标以防止用户在等待列表时重复点击。

所以计时测试现在成功 在常规使用中,列表不会超过 150 人,所以如果可以容纳 1,000 人...对我来说没问题 :-)

非常感谢(@all)的帮助。

4

3 回答 3

2

我不知道你到底想要什么,但是你在这个 json 列表中使用分页吗?列出分页为 10、20、30 行等的值,并给 ajax 服务器调用以获取下一批分页行。

于 2013-07-08T16:43:10.433 回答
0

如果我是你,我会按照以下步骤操作:

  1. 追踪获取数据的查询并计时
  2. 使用该页面的静态版本,无需进行任何服务器端调用,只需将 JSON 结果放入文件并加载,查看代码的行为方式
  3. 正如@Chris Pitman 所说,GET 需要多少时间

按照以下步骤,您应该能够大致找到问题所在。

作为一般规则,我建议您增加搜索开始的字母数量,这样您就不会返回很多结果,从而减少加载时间,也因为没有人希望您在用户输入时返回结果“ a" 在搜索字段中。

您可能想要评估的另一件事是传递一个更薄的数组,仅包含用户的电子邮件,在请求时获取更多数据,根据定义,电子邮件是唯一的。

于 2013-07-08T16:41:40.933 回答
0

您的问题与“性能泄漏”跟踪没有直接关系,因为您知道问题出在哪里并且您已经确定了罪魁祸首:您正在处理大量数据。Alberto 建议通过更薄的阵列并尝试用更少的资源做更多的事情,这是一个很好的起点。Ase Ena 对您的数据进行分页的建议很明显,但(我猜)有点超出您的舒适区。

如果此人员列表在整个应用程序中经常被访问和使用,Alberto 建议将列表缓存在其自己的 JSON 文件中是一个很好的建议。这将在每次需要列表时为您节省大量的数据库查询,并使您不必进行后续的 ajax 调用来检索数据。此外,它将被缓存在您的客户端计算机上(甚至在访问应用程序时)并提高性能,因为不必在每次访问应用程序或每次需要显示列表时都下载它。作为额外的好处,在客户端缓存整个列表极大地简化了您将用于遍历数据的分页机制,因为您不必管理服务器端 SQL、会话状态等。

编辑 -

我突然想到,当我说“在客户端缓存 JSON 文件”时,您可能不知道我的意思。这是一个例子:

<script src="MyPeopleList.json?v1" type="text/javascript"></script>

您基本上只是以与任何其他 javascript 相同的方式链接 json 文件。您的 JSON 用户列表现在可供应用程序的其余部分使用,并且也已缓存。如果您需要刷新列表或确保您的用户获得最新和最好的列表版本,您只需将“v1”更改为“v2”即可。(版本控制很重要,因为某些类型的 Internet Explorer 会主动缓存这些文件,即使服务器上的文件比缓存中的文件新也不会刷新)。

于 2013-07-08T17:05:31.587 回答