正如我所知,在java8中HashMap的桶实现有所改变.如果桶大小超过某个值,则列表转换为"平衡树".
我不明白
1. Oracle JDK中使用什么类型的平衡树?(AVL?red-black?类似于索引数据库?)
2.是二叉树吗?
据我所知,排序是根据哈希码执行的.例如,在我的桶中,我有102个元素.带有hashcode的100个值12(我明白它值得但我只需要理解这个行为)和2带有hashcode 22.
如何执行搜索值?
我有简单的ASP.NET应用程序,它只使用ImageResizer调整图像大小,并且不执行任何其他操作.出于测试目的,我禁用了磁盘缓存,因此每次请求都会调整图像大小.
当我使用JMeter测试应用程序的性能时,我得到以下平均响应时间:
如您所见,当我运行单个工作进程和10个并发客户端时,尽管有可用的硬件资源,响应时间也会急剧增加:性能测试期间的CPU使用率约为30%,内存使用量约为150MB.
如这里所讨论的,
Web园的设计只有一个原因 - 提供不受CPU约束但执行长时间运行请求的应用程序能够扩展并且不会耗尽工作进程中可用的所有线程.
这似乎不是我的情况.
我不明白为什么会得到这样的结果.我所期望的是,即使是单个工作进程也会提供可接受的响应时间,直到达到资源限制.10个并发客户端绝对不是一个重负载.有人可以向我解释,我错在哪里?
我的配置:
我的应用程序只是带有ImageResizer的空ASP.NET MVC应用程序,在此指令中添加(选项3 - 手动安装)并在Web.config中禁用DiskCache插件
如果我想用我的docker容器设置NGINX,一个选项是在我的设置NGINX实例docker-compose.yml,并将NGINX容器链接到所有应用程序容器.
然而,这种方法的缺点是docker-compose.yml变为服务器级别,因为只有一个NGINX容器可以将端口80/443暴露给互联网.
我感兴趣的是,能够docker-compose.yml在同一台服务器上定义多个,但仍然可以通过单个服务器特定的NGINX容器轻松地在每个组合文件中公开面向公众的容器.
我觉得这应该很简单,但我还没有找到一个好的资源或示例.
我使用TeamCity Kotlin DSL 2018.1来设置构建配置.我的settings.kts文件如下所示:
version = "2018.1"
project {
buildType {
id("some-id")
name = "name"
steps {
ant {
name = "Step1"
targets = "target1"
mode = antFile { path = "/some/path" }
workingDir = "/some/dir"
jdkHome = "some_jdk"
}
ant {
name = "Step2"
targets = "target2"
mode = antFile { path = "/some/path" }
workingDir = "/some/dir"
jdkHome = "some_jdk"
}
...
}
}
}
Run Code Online (Sandbox Code Playgroud)
它按预期工作,但我想避免一遍又一遍地为每个步骤编写相同的重复参数.
我试着编写函数,它将构造预填充默认值的构建步骤:
fun customAnt(init: AntBuildStep.() -> kotlin.Unit): AntBuildStep {
val ant_file = AntBuildStep.Mode.AntFile() …Run Code Online (Sandbox Code Playgroud) 想象一个简单的案例:
class B{
public final String text;
public B(String text){
this.text = text;
}
}
class A {
private List<B> bs = new ArrayList<B>;
public B getB(String text){
for(B b :bs){
if(b.text.equals(text)){
return b;
}
}
return null;
}
[getter/setter]
}
Run Code Online (Sandbox Code Playgroud)
想象一下,对于A的每个实例,List<B>它很大,我们需要getB(String) 经常调用.但是假设列表也可以更改(添加/删除元素,甚至重新分配).
在此阶段,getB(String)的平均复杂度为O(n).为了改进,我想知道我们是否可以使用一些聪明的缓存.
想象一下,我们将密钥缓存List<B>在Map<String, B>密钥所在的位置B.text.这样可以提高性能,但如果更改列表(新元素或已删除元素)或重新分配列表(A.bs指向新引用),它将无法工作.
为了解决这个问题,我认为,除此之外Map<String, B>,我们可以存储列表的哈希值bs.当我们调用getB(String)方法时,我们计算列表的哈希值bs.如果哈希没有改变,我们从地图中获取结果,如果我们重新加载地图.
问题是计算a的散列java.util.List遍历列表的所有元素并计算它们的散列,至少为O(n).
题
我想知道的是,JVM是否会更快地计算List的哈希值,而不是通过getB(String)方法中的循环.可能这取决于hash的实现B.如果是这样,什么样的东西可以工作?简而言之,我想知道这是愚蠢还是可以带来一些性能提升.