如何更新具有良好性能的已修改字符串

时间:2013-12-12 17:15:43

标签: javascript string performance

我正在创建一个可以被许多用户同时修改的文档。简化文档可以被认为是一个字符串。在进行修改时,整个字符串被发送到所有客户端,并且它们的字符串版本被替换为新的字符串。就通过网络发送的数据量而言,这对于大字符串来说非常重要。所以我想尽可能少地发送,即使这意味着更多的工作客户端。

我使用的是javascript,但这并不重要。

我已经开始将字符串保存为变量“oldstring”,并且在修改之后我有变量“newstring”。我发送变量“message”(目前它等于“newstring”)。所有客户都收到“message”并使用它“oldstring”更新

非常感谢所有帮助。 :)

1 个答案:

答案 0 :(得分: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);