gpt4 book ai didi

java - Java中各种输入的函数的内存

转载 作者:行者123 更新时间:2023-11-30 03:17:32 27 4
gpt4 key购买 nike

我有一个昂贵的函数,采用各种 double 变量作为输入:

public double f(double v1, double v2, double v3){
...
return output;
}

所以我尝试使用两种不同的策略来记住它的输出。

嵌套 HashMap:

Map<Double,Map<Double,Map<Double,Double>>> map = new HashMap<>();

public double f(double v1, double v2, double v3){
// This is abbreviated: in my case I made sure to call only once each "get()"
if(map.containsKey(v1) && map.get(v1).containsKey(v2) && map.get(v1).get(v2).containsKey(v3))
return map.get(v1).get(v2).get(v3);
...
// calculations
...
// put "output" in the map (and create new intermediate HashMaps when needed)
...
return output;
}

自定义 HashMap 键:

public class DoubleKey {
public final double[] values;
public DoubleKey(double[] values){ this.values = values;}

@Override
public boolean equals(Object key){
if(key instanceof DoubleKey)
return Arrays.equals(values, ((DoubleKey)key).values);
return false;
}

@Override
public int hashcode(){
return Arrays.hashcode(values);
}
}

Map<DoubleKey,Double> map = new HashMap<>();

public double f(double v1, double v2, double v3){
DoubleKey key = new DoubleKey(new double[]{v1,v2,v3});
if(map.containsKey(key))
return map.get(key);
...
// calculations
...
map.put(key, output);
return output;
}
<小时/>

现在,我预计第二种方法会更快,因为它使用单个 Hashmap,并且通常感觉更优雅。但事实证明,与速度大幅提升的第一种方法相比,我从第二种方法中获得的好处较少。

你知道为什么第二种方法效率较低吗?是使用 Arrays.equals() 和/或 Arrays.hashcode() 的成本吗?

更一般地说,您是否知道其他更有效的内存技术?

最佳答案

这两个解不相等。第一个硬编码仅支持 3 个双参数,而第二个则支持任意数量的参数。

如果你只需要支持 3 个参数,我认为保存 3 个实例变量会更有效:

编辑:以下评论,用明确的单独参数替换了使用 varargs ctor 的原始答案。可能更有效(不构造数组)。还将实例变量设为最终变量以启用编译器优化

public class DoubleKey
{
final double arg1, arg2, arg3;
final int hashCode;

public DoubleKey(double arg1, double arg2, double arg3)
{
this.arg1 = arg1;
this.arg2 = arg2;
this.arg3 = arg3;
hashCode = Objects.hash(arg1, arg2, arg3);
}

@Override
public boolean equals(Object key)
{
if (key instanceof DoubleKey) {
DoubleKey dk = (DoubleKey) key;
return arg1 == dk.arg1 && arg2 == dk.arg2 && arg3 == dk.arg3;
}
return false;
}

@Override
public int hashCode()
{
return hashCode;
}
}

现在可以更方便地构建 DoubleKey 实例

DoubleKey key = new DoubleKey(v1,v2,v3);

关于java - Java中各种输入的函数的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32221821/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com