我正在开发一个多语言的ASP.NET网站。我希望用户能够“动态”添加翻译,因此我将翻译存储在数据库中并维护包含所有翻译的ASP.NET应用程序对象(用于提高性能)。我使用一个简单的Hashtable来存储翻译,然后我将它存储在Application对象中并在呈现页面时引用它。
有些翻译条目很短,有些很长。这一切都取决于用户想要翻译的内容。每当网站呈现控制标签或帮助文本时,它会检查Hashtable以查看它是否包含英文版本的翻译,如果是,则使用Hashtable版本(假设是外语用户 - 我使用单独的每种语言的应用程序级对象。)
典型的Hashtable条目可能是:key ='今天要做的事情',值='Mon charge pour aujourd'hui'。代码在桌面上查找“今天要做的事情” - 如果发现翻译它会使用它,如果不是,它只使用英文版。
我的问题是:Hashtable是最具性能的收藏品吗?我可以通过使用不同的集合/密钥结构,甚至完全使用不同的机制来以某种方式提高性能/内存使用量吗?我的想法是,我宁愿使用Application对象而不是为每个翻译执行不同的数据库读取 - 每个页面渲染可能有数十个翻译。
答案 0 :(得分:1)
我建议另一种方法 - 创建一个“脚本”,它将您的自定义源(db或您拥有的任何内容)的翻译转换为.NET资源文件,插入一个命令,将其运行到项目的Before-Build事件中。这样您就可以使用.NET平台的本机本地化功能,并且仍然可以在任何您想要的地方存储翻译。
由Iain Galloway评论:
几乎总是值得一去 平台的颗粒,而不是 反对它。
答案 1 :(得分:0)
如果您想要快速访问权限,可以尝试增加Trie
答案 2 :(得分:0)
我认为,考虑到总是必须存储的字节数或多或少是不变的,因此内存并不是一个问题。无论您使用何种机制,keyvalue映射大小都是等效的。
然而,对于表现而言,这并不成立。当使用keyvalue集合(例如散列表或字典)时,使用输入计算字典中使用的散列。即如果您的密钥是“abcdefg”,则使用GetHashcode()函数对其进行哈希处理。如果你对gethashcode(即输入字符串abcdefg)的输入更长,这个函数显然会使用更多的计算能力。 例如,您可以通过覆盖函数使gethashcode在字符串长度方面成为常量函数O(1),并让它根据字符串的常量输入字符返回哈希码。当然,这可能会破坏哈希表的平衡,导致查找速度变慢。你应该对此进行基准测试以确定。
另一个解决方案是为每种语言保留字典/哈希表,并将其作为关键字进行短暂的避免。在查找时,您将有一个switch语句,它选择正确的字典并使用abbrivated键提取字符串。这样做的缺点是你增加了内存使用量,但理论上 会减少查找时间。同样在这种情况下,您必须进行基准测试,以确定是否存在任何(正面)差异。
正如旁注,这听起来像是一种过早的优化。我不认为这样的查找会成为你应用程序的瓶颈。