我发现这个问题关于哪些语言优化尾递归.为什么C#不会优化尾递归?
对于具体情况,为什么不将此方法优化为循环(Visual Studio 2008 32位,如果这很重要)?:
private static void Foo(int i)
{
if (i == 1000000)
return;
if (i % 100 == 0)
Console.WriteLine(i);
Foo(i+1);
}
Run Code Online (Sandbox Code Playgroud) 我想创建一个大的HashMap,但put()性能不够好.有任何想法吗?
其他数据结构建议是受欢迎的,但我需要Java Map的查找功能:
map.get(key)
在我的情况下,我想创建一个包含2600万条目的地图.使用标准Java HashMap,在2-3百万次插入后,放置速率变得无法忍受.
此外,是否有人知道为密钥使用不同的哈希代码分发是否有帮助?
我的哈希码方法:
byte[] a = new byte[2];
byte[] b = new byte[3];
...
public int hashCode() {
int hash = 503;
hash = hash * 5381 + (a[0] + a[1]);
hash = hash * 5381 + (b[0] + b[1] + b[2]);
return hash;
}
Run Code Online (Sandbox Code Playgroud)
我使用add的associative属性来确保相等的对象具有相同的哈希码.数组是字节,其值在0到51之间.值只在一个数组中使用一次.如果a数组包含相同的值(按任意顺序),则对象相等,而b数组则相同.所以a = {0,1} b = {45,12,33}和a = {1,0} b = {33,45,12}是相等的.
编辑,一些说明:
一些人批评使用哈希映射或其他数据结构来存储2600万个条目.我不明白为什么这看起来很奇怪.它看起来像是一个经典的数据结构和算法问题.我有2600万个项目,我希望能够快速将它们插入并从数据结构中查找它们:给我数据结构和算法.
将默认Java HashMap的初始容量设置为2600万会降低性能.
有些人建议使用数据库,在某些其他情况下这绝对是明智的选择.但我真的在问一个数据结构和算法的问题,一个完整的数据库会比一个好的数据结构解决方案过度而且速度慢得多(毕竟数据库只是软件,但会有通信和可能的磁盘开销).
正如webpack的wiki所说,可以使用分析工具来优化构建性能:
来自:https://github.com/webpack/docs/wiki/build-performance#hints-from-build-stats
来自构建统计数据的提示
有一个分析工具可以显示您的构建,并提供一些提示如何优化构建大小和构建性能.
您可以通过运行webpack --profile --json> stats.json来生成所需的JSON文件
我生成stats文件(可在此处)将其上传到webpack的analize工具
,在Hints选项卡下我告诉我使用prefetchPlugin:
来自:http://webpack.github.io/analyse/#hints
长模块构建链
使用预取来提高构建性能.从链的中间预取模块.
我从里面挖出网页,找到prefechPlugin上唯一可用的文档是这样的:
来自:https://webpack.js.org/plugins/prefetch-plugin/
PrefetchPlugin
new webpack.PrefetchPlugin([context], request)对正常模块的请求,即使在需要之前解析和构建也是如此.这可以提高性能.尝试首先分析构建以确定聪明的预取点.
我真的很感激一些例子
请帮助我将这个问题作为下一个想要使用prefechPlugin和Analyze工具的开发人员的宝贵资源.谢谢.
是什么在差异Dictionary.add(key, value)和Dictionary[key] = value?
我注意到最后一个版本ArgumentException在插入重复密钥时没有抛出,但有没有理由更喜欢第一个版本?
编辑:有没有人有权威的信息来源?我尝试过MSDN,但它一如既往的野鹅追逐:(
有没有办法使用模型的整数id设置外键关系?这将用于优化目的.
例如,假设我有一个Employee模型:
class Employee(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
type = models.ForeignKey('EmployeeType')
Run Code Online (Sandbox Code Playgroud)
和
EmployeeType(models.Model):
type = models.CharField(max_length=100)
Run Code Online (Sandbox Code Playgroud)
我希望拥有无限制员工类型的灵活性,但在部署的应用程序中,可能只有一种类型,所以我想知道是否有办法对id进行硬编码并以这种方式设置关系.这样我就可以避免db调用来获取EmployeeType对象.
在jvm-prevent-tail-call-optimization之后两年,似乎有一个原型 实现,MLVM已经将该功能列为"proto 80%"一段时间了.
Sun的/ Oracle方面是否没有积极的兴趣支持尾调用,或者只是尾部调用" 在每个功能优先级列表中排在第二位 [...]"如JVM所述语言峰会?
如果有人测试了MLVM构建并且可以分享它的工作原理(如果有的话),我会非常感兴趣.
更新: 请注意,像Avian这样的某些虚拟机支持正确的尾部调用,没有任何问题.
java language-agnostic optimization jvm tail-call-optimization
我最近在Eclipse中查看了我的警告并遇到了这个问题:

如果方法可以声明为static,它将给出编译器警告.
[edit] Eclipse帮助中的确切引用,对私有和最终的压力:
启用后,编译器将对private或final方法发出错误或警告,并且仅引用静态成员.
是的我知道我可以关掉它,但我想知道打开它的原因?
为什么将每个方法声明为静态是一件好事?
这会带来任何性能优势吗?(在移动领域)
指出一个方法为静态,我想是显示你不使用任何实例变量因此可以移动到utils样式类?
在一天结束时,我应该关闭它"忽略"或者我应该修复它给我的100多个警告吗?
你认为这只是污染代码的额外关键字,因为编译器无论如何只会内联这些方法吗?(有点像你没有声明每个变量你可以最终但你可以).
这个答案给出了短字符串优化(SSO)的一个很好的高级概述.但是,我想更详细地了解它在实践中是如何工作的,特别是在libc ++实现中:
为了符合SSO资格,字符串有多短?这取决于目标架构吗?
在访问字符串数据时,实现如何区分短字符串和长字符串?它m_size <= 16是一个简单的,还是一个标志,是其他成员变量的一部分?(我想这m_size或其中的一部分也可能用于存储字符串数据).
我专门针对libc ++问了这个问题,因为我知道它使用SSO,甚至在libc ++主页上也提到过.
以下是查看来源后的一些观察结果:
libc ++可以使用两个稍微不同的字符串类内存布局进行编译,这由_LIBCPP_ALTERNATE_STRING_LAYOUT标志控制.这两种布局还区分了little-endian和big-endian机器,这使我们总共有4种不同的变体.我将在下面的内容中假设"正常"布局和小端.
假设进一步size_type是4个字节并且value_type是1个字节,这就是字符串的前4个字节在内存中的样子:
// short string: (s)ize and 3 bytes of char (d)ata
sssssss0;dddddddd;dddddddd;dddddddd
^- is_long = 0
// long string: (c)apacity
ccccccc1;cccccccc;cccccccc;cccccccc
^- is_long = 1
Run Code Online (Sandbox Code Playgroud)
由于短字符串的大小在高7位,因此在访问它时需要移位:
size_type __get_short_size() const {
return __r_.first().__s.__size_ >> 1;
}
Run Code Online (Sandbox Code Playgroud)
类似地,长字符串容量的getter和setter用于__long_mask解决这个问题is_long.
我仍在寻找我的第一个问题的答案,即__min_cap短字符串的容量对不同的架构有什么价值?
其他标准库实现
这个答案很好地概述了std::string其他标准库实现中的内存布局.
我有一个在交易过程中需要很长时间的查询.当我得到wait_type它的过程时PAGEIOLATCH_SH.
这种等待类型是什么意思,如何解决?
制作String小写字母的第一个字符的最有效方法是什么?
我可以想到许多方法来做到这一点:
使用charAt()与substring()
String input = "SomeInputString";
String output = Character.toLowerCase(input.charAt(0)) +
(input.length() > 1 ? input.substring(1) : "");
Run Code Online (Sandbox Code Playgroud)
或者使用char数组
String input = "SomeInputString";
char c[] = input.toCharArray();
c[0] = Character.toLowerCase(c[0]);
String output = new String(c);
Run Code Online (Sandbox Code Playgroud)
我相信还有很多其他很好的方法可以实现这一目标.您有什么推荐的吗?
optimization ×10
java ×4
c# ×2
performance ×2
string ×2
.net ×1
c++ ×1
coding-style ×1
dictionary ×1
django ×1
foreign-keys ×1
hashmap ×1
jvm ×1
libc++ ×1
map ×1
sql-server ×1
static ×1
t-sql ×1
webpack ×1