【发布时间】:2018-03-28 15:45:35
【问题描述】:
为什么spring验证比自己的验证慢? 我不想编写自己的验证器。
在购物车中有 20,000 个项目(没有导致验证异常)并调用我们在这些时间得到的两个休息端点:/test/spring -> 62.145 ms /test/own -> 11.35 毫秒
两个端点运行 200 次。结果的时间是平均时间。 有 20.000 件商品的购物车当然是不现实的,这也不是重点。
@RequestMapping(path = "/spring", method = RequestMethod.POST)
public ResponseEntity<Object> postSpringValidation(@RequestBody **@Valid** Cart cart) {
return new ResponseEntity<>(HttpStatus.CREATED);
}
@RequestMapping(path = "/own", method = RequestMethod.POST)
public ResponseEntity<Object> postOwnValidation(@RequestBody Cart cart) {
if (!cart.isValidData()) {
throw new InvalidParameterException("invalid data");
}
return new ResponseEntity<>(HttpStatus.CREATED);
}
public class Cart {
@NotNull
private String id;
@Valid
@NotNull
private List<Item> items;
public boolean isValidData() {
if (id == null)
return false;
for (Item item : items) {
if (!item.isValidData()) {
return false;
}
}
return true;
}
}
public class Item {
@NotNull
private String id;
public boolean isValidData() {
if (id == null)
return false;
return true;
}
}
【问题讨论】:
-
尝试调试代码 - 你会发现 spring 不仅仅是调用
shop.isValidData。但我问自己的问题是:为什么这很重要?这可能不是您想要优化的东西... -
需要多少项目才能注意到有意义的差异?对于实际用户来说,该项目数是否现实?
-
忽略“那是不现实的”的愚蠢回答,你会在 spring 中遇到的一个问题是你为 CPU 时间的便利付出了代价。在很多地方,似乎是反射导致它变慢。如果你希望你的 API 更快,你必须放弃 spring 帮助你的任何东西,包括不使用注释来映射变量和自己写入响应。您应该考虑使用 jvisualvm,因为您可能能够找到 spring 内部的缓慢并提出更改建议。
标签: java spring hibernate validation bean-validation