我有一个小型的java类,它将在云应用服务器上运行,因此需要尽快执行。
我需要做的是迭代List<Map>
,获取当前Map
的内容,然后对其做一些逻辑。 Map
包含字符串和双精度。
这是我目前的实施:
for (int i = 0; i < count; i++) {
Map data = result.get(i);
double priceToCheck = Double.parseDouble(data.get("value").toString());
String criteria = data.get("criteria").toString();
String coin = data.get("coin").toString();
if (coin.equals("BTC")) {
if (criteria.equals("above")) {
if (BTC > priceToCheck) {
// create notficaition
sendNotification = true;
}
} else {
if (BTC < priceToCheck) {
// create notification
sendNotification = true;
}
}
} else if (coin.equals("BCH")) {
if (criteria.equals("above")) {
if (BCH > priceToCheck) {
// create notficaition
sendNotification = true;
}
} else {
if (BCH < priceToCheck) {
// create notification
sendNotification = true;
}
}
} else if (coin.equals("ETH")) {
if (criteria.equals("above")) {
if (ETH > priceToCheck) {
// create notficaition
sendNotification = true;
}
} else {
if (ETH < priceToCheck) {
// create notification
sendNotification = true;
}
}
} else if (coin.equals("ETC")) {
if (criteria.equals("above")) {
if (ETC > priceToCheck) {
// create notficaition
sendNotification = true;
}
} else {
if (ETC < priceToCheck) {
// create notification
sendNotification = true;
}
}
} else if (coin.equals("LTC")) {
if (criteria.equals("above")) {
if (LTC > priceToCheck) {
// create notficaition
sendNotification = true;
}
} else {
if (LTC < priceToCheck) {
// create notification
sendNotification = true;
}
}
} else if (coin.equals("XRP")) {
if (criteria.equals("above")) {
if (XRP > priceToCheck) {
// create notficaition
sendNotification = true;
}
} else {
if (XRP < priceToCheck) {
// create notification
sendNotification = true;
}
}
}
result
是List<Map>
,"BTC"
是字符串,BTC
是双
正如您可以看到if语句检查字符串coin
的最高级别,有六个可能的值。找到coin
后,我会确定criteria
的值,然后根据criteria
我觉得这是完成这项任务的一种非常繁琐的方式,它可以工作但速度相对较慢。如果不直接访问每个Map
元素并手动检查内容,我想不出加快速度的方法。
还有其他人有什么想法吗?
答案 0 :(得分:2)
我有一个小型的java类,它将在云应用服务器上运行,因此需要尽快执行。
首先,那里有一些令人怀疑的假设。
是的,您的代码尽可能快地运行是很好的,但在大多数情况下并不是必需的。特别是,您在云服务器上运行的事实并不一定使其变得必不可少。
您认为您的应用程序运行速度不够快。 (你有基准吗?)
您认为代码的这一部分是(或将要)代码太慢。 (你有没有实现它?你有没有想过它?)
而且:
我觉得这是完成这项任务的一种非常繁琐的方式,它可以工作但速度相对较慢。
繁琐而缓慢并不相同。通常繁琐冗长/笨重更快而不是简洁/优雅。
现在针对您的代码的潜在性能问题。 (请记住,这可能都与您的假设无关!)
如果字段是/可以在编译时知道,最好使用自定义类而不是Map
。 Map::get
方法比自定义类上的getter慢几个数量级,而Map通常会使用一个数量级更多的内存。
自定义类还允许您使用原始类型等,而不是将值转换为String
。避免这种情况也会带来性能上的好处。
这很慢:
double priceToCheck = Double.parseDouble(data.get("value").toString());
您似乎正在使用double
(或Double
), converting it to a string and then converting it back to a
双倍。数字和十进制字符串之间的转换相对昂贵。
如果在编译时已知coin
和criteria
的值,请考虑使用enum
或boolean
而不是字符串。比较会更快,您将能够在布尔情况下使用switch
语句...或简单的if
。
事实上,通过列表的迭代是一个方面,这不是很多优化的机会。
答案 1 :(得分:0)
这里有一个非常突出的优化。您的原始代码snippit将遍历整个列表以调整sendNotification
布尔值。
如果您需要设置sendNotification
,则可以在每个条件中策略性地放置break
。这将在所需行为之后使回路短路。在最糟糕的情况下,您最终会遍历整个列表。
for (int i = 0; i < count; i++) {
if (coin.equals("BTC")) {
if (criteria.equals("above")) {
if (BTC > priceToCheck) {
// create notficaition
sendNotification = true;
break; // exits the loop
}
} else {
if (BTC < priceToCheck) {
// create notification
sendNotification = true;
break;
}
}
} else if (coin.equals("BCH")) {
if (criteria.equals("above")) {
if (BCH > priceToCheck) {
// create notficaition
sendNotification = true;
break;
}