2010-08-16 103 views
0

我正在开发一个多语言ASP.NET网站。我希望用户能够随时添加翻译,因此我将翻译存储在数据库中并维护包含所有翻译(用于性能)的ASP.NET应用程序对象。我使用一个简单的Hashtable存储翻译,然后将其存储在Application对象中,并在呈现页面时引用它。大型密钥的最佳c#集合

一些翻译条目很短,有些很长。这完全取决于用户想要翻译的内容。无论何时站点正在呈现控制标签或帮助文本,它都会检查Hashtable以查看它是否包含英文版的翻译,如果是,则使用Hashtable版本(假设是外语用户 - 我使用单独的每种语言的应用程序级对象)。

典型的Hashtable条目可能是:key ='今天要做的事情',value ='Mon Charge pour aujourd'hui'。代码在表格中查找“今天要做的事情” - 如果找到了翻译,则使用它,如果不是,则只使用英文版。

我的问题是这样的:是一个Hashtable这个最高性能的集合?我可以通过使用不同的集合/密钥结构来提高性能/内存使用率,或者甚至完全使用不同的机制?我的想法是,我宁愿使用Application对象,而不是为每个翻译做不同的数据库读取 - 每页可能有数十个翻译呈现。

回答

0

我认为记忆是没有这么多的问题,给你总是必须存储或多或少是不变的字节数。无论您使用什么机制,keyvalue映射大小都是等效的。

但是,对于性能而言,这并不成立。当使用keyvalue集合(例如散列表或字典)时,字典中使用的散列是使用输入计算的。即如果您的密钥是“abcdefg”,则使用GetHashcode()函数对其进行散列处理。如果您输入的gethashcode(即输入字符串abcdefg)较长,此功能显然会使用更多的计算能力。 例如,您可以通过覆盖函数使gethashcode成为函数O(1)的常量函数,并根据字符串的常量输入字符数返回哈希码。当然,这可能会制约你的哈希表的平衡,导致查找速度变慢。你应该确定基准。

另一种解决方案是为每种语言保留一个字典/散列表,并将其用作关键字的一些简短缩写。在查找之后,您将得到一个switch语句,该语句挑选正确的字典并使用abbrivated密钥提取字符串。这个缺点是你增加了内存使用量,但理论上减少了查找时间。同样在这种情况下,您必须进行基准测试,以确定是否有任何(正面)差异。

作为旁注,这听起来对我来说是一个不成熟的优化。我不认为这样的查找会成为你应用程序的瓶颈。

0

如果你想快速访问您可能试种Trie

+0

一个trie非常有效,因为这些键比平均使用时间要长得多,导致了巨大的Trie。因此你浪费记忆,性能也不会增加。尝试对较短的键很有用。 – Henri 2010-08-16 11:17:09

1

我建议另一种方法 - 创建一个“剧本”,这将转换翻译从自定义源(DB或任何你有)到.NET资源文件,插入一个命令,将其运行到项目的Before-Build事件中。这样您就可以使用.NET平台的本地化本地化功能,并且仍然可以将翻译存储在任何你想要的地方。

由于Iain Galloway评论:

这几乎总是值得 去平台的粮食,而不是 反对。

+0

+1。这将会更加努力,但会付出代价。用平台的谷物而不是反对它几乎总是值得的。 – 2010-08-16 11:13:26

+0

尽管我同意这是一个更好的设计,但我怀疑这是否会提高性能。我甚至认为它会降低性能,因为本地化本地化也使用底层字典。 – Henri 2010-08-16 11:13:41

+0

感谢您的意见。我非常希望用户在使用系统时能够添加翻译(因为他们发现遗漏,不准确等)。我可以轻松地更新基于应用程序对象的内存对象,以便即时查看新翻译,因此我不想采用更静态的方法。 – DEH 2010-08-16 11:40:07