【问题标题】:How to update a modified string with good performance如何以良好的性能更新修改后的字符串
【发布时间】:2013-12-31 05:46:15
【问题描述】:
我正在创建一个可以被多个用户同时修改的文档。为了简化文档,可以认为是一个字符串。在进行修改的那一刻,整个字符串被发送到所有客户端,并且他们的字符串版本被新版本替换。就通过网络发送的数据量而言,这对于大字符串来说是非常沉重的。所以我想尽可能少地发送,即使这意味着更多的工作客户端。
我正在使用 javascript,但这并不重要。
我首先将字符串保存为变量“oldstring”,修改后我有变量“newstring”。我发送变量“消息”(此时等于“新字符串”)。所有客户端都收到“消息”,并使用它更新他们的“旧字符串”
非常感谢所有帮助。 :)
【问题讨论】:
标签:
javascript
string
performance
【解决方案1】:
您可以使用Google Diff/Match/Patch library 实现此目的。它具有 Python、C++、Java、LUA、Objective C 和 Javascript 的绑定。您可以将原始版本下载到客户端,在服务器端生成补丁列表(您需要跟踪哪个客户端有哪个版本以了解您的起点是什么;这可以在客户端或服务器),将客户端本地修订的补丁拉到客户端,并使用客户端库来应用补丁。获得更改后,您需要更新该客户端修订跟踪号。
为了完整起见,我已经包含了一个实现示例。这个库的运行效果给我留下了深刻的印象,并打算将其保留在我的工具带中。
// C# server-side code
DiffMatchPatch.diff_match_patch differ = new DiffMatchPatch.diff_match_patch();
// I'm using literals, you'd pull these from a DB, etc.
var results = differ.patch_make("ABCDEFG", "ABCDEFQ");
var serializedResults = differ.patch_toText(results);
// Send serializedResults to client...
在客户端:
// Javascript client-side code
var patcher = new diff_match_patch();
// The below literal is what *would* be sent
var patches = patcher.patch_fromText("@@ -3,5 +3,5 @@\n CDEF\n-G\n+Q\n");
var results = patcher.patch_apply(patches, 'ABCDEFG');
alert(results);