1

我有一个功能允许用户创建项目并在此页面上查看它。他们可以导入资源(pdf、img 等)以与他们的项目一起保存。所以现在我想创建一个功能,允许用户导出他们所有的东西,以及与他们在同一组中的那些人,它们都整齐地用漂亮的丝带绑在一个 zip 文件中。

目前我正在使用 Archive:Zip 抢先压缩文件,保留他们的 CRC32 校验和并将其作为每日 cronjob 运行以减少用户等待时间。但是,如果对任何文件有任何更改,我将不得不重新运行整个过程。

我的初始基准测试显示 103MB 的文件最多需要 47 秒才能运行。该过程涉及生成将它们链接到 XSL 的 XML、复制图像、用于 iframe 的 html 等等。

我正在考虑创建一个表或文本文件,以将所有文件的 CRC32 校验和或上次修改日期保存在临时存储区域中,并在每次用户单击导出时与此列表进行比较,如果有任何新文件,我将从缓存的 zip 文件中删除相同的文件并添加新文件。或者我将保留所有松散的文件并复制和替换较新的文件,然后在每次单击时进行存档。

我的问题是:

  1. 这是否被认为是一种不成熟或糟糕的优化技术?
  2. 我应该如何正确优化这个?
  3. 对于这些优化技术,我可以学习一些书籍或资源吗?
4

1 回答 1

1

这个想法有什么问题:

  • 每当用户文件更改(添加、删除或更改文件)时设置某种标志。
  • 对每个文件已更改的用户运行夜间压缩,然后重置该标志。
  • 如果用户在设置标志时请求导出,则必须在导出完成之前再次进行压缩(没有办法解决)。

为了进一步加快用户体验,您还可以将导出请求与导出操作分离。例如,当用户(其标志已设置)请求导出时,通知他们将在压缩发生时完成,并设置不同的标志。然后修改上面的第二步,如果设置了第二个标志,也可以导出新创建的包。

这会给用户即时反馈,即会发生某些事情,但会将繁重的工作转移到未来。

或者,您不必将导出绑定到压缩。您可以每天晚上压缩,但根据需要在白天允许额外的压缩/导出作业。但是,将请求与事件分离仍然很好。

回答您的具体问题。

1/ 我不认为这种过早或糟糕的优化。“代码”在功能上是完整的,因为它可以满足您的所有要求,因此是优化的最佳时机。此外,您已经确定了瓶颈并正在优化正确的区域。

2/见我上面的文字。您应该通过完全按照您所做的来优化它 - 确定瓶颈并专注于改进它。鉴于您不太可能获得更好的压缩性能,我建议的解耦“技巧”是一个很好的方法。像进度条和闪屏一样,它通常更多地与用户对速度的感知有关,而不是速度本身。

3/ 书籍?不要打扰,网上有成千上万的资源。继续询问 SO 并打印出所有回复。最终你的大脑会和我一样充实,每一个新的代码片段都会让你暂时忘记你妻子的名字:-)。

于 2009-01-05T10:17:35.700 回答