多次调用同一函数进行计算,需要更好的方法来处理它

时间:2017-05-24 16:12:26

标签: c# jquery ajax .net-core

所以,这就是场景。

有一个静态类根据提供的数据进行一些计算。

public static class Calculations
{
  public static object Calculate(IList<Class> listOfClass)
  {
     /// going to database and do calculations....
     return calculatedValue;
  }
}

现在在页面加载时,我们同时制作20个AJAX请求(仅使用JQUERY),它在控制器中调用不同的动作。所以举个例子。

public class ClientController
   {
      [HttpPost]
      public IActionResult GetAGraph(Object model)
      {
         var listOfClass = // get data based on the model
         var calculatedValue = Calculations.Calculate(listOfClass);
         var returnObject = //do something with calculatedValue
         return Json(returnObject);
      }

      [HttpPost]
      public IActionResult GetSecondGraph(Object model)
      {
         var listOfClass = // get data based on the model
         var calculatedValue = Calculations.Calculate(listOfClass);
         var returnObject = //do something with calculatedValue
         return Json(returnObject);
      }

      [HttpPost]
      public IActionResult GetThirdGraph(Object model)
      {
         var listOfClass = // get data based on the model
         var calculatedValue = Calculations.Calculate(listOfClass);
         var returnObject = //do something with calculatedValue
         return Json(returnObject);
      }   
   }

它没有做同样的事情,因为客户条款,我不允许发布实际代码。

我想要实现的不是在每个控制器动作上进行相同的计算,而是如果我们可以在全局某处存储计算值并将其用于后续调用,那么它将提高性能并节省大量时间或任何其他解决方案不要一次又一次地进行相同的计算。

注意:无法使用内存缓存,因为每晚都会上传新数据,这会影响计算。

谢谢大家的帮助!!

2 个答案:

答案 0 :(得分:2)

有几种方法可以优化性能,但鉴于您的问题中缺少具体细节,建议会有点受限:

  1. 每晚上传的数据不应该是使用内存缓存的showstopper。您的请求几乎同时发生,因此您的缓存可能是短暂的(比如一分钟)。上传新数据后,您只需要花费大约一分钟的时间,这在很多情况下是可以接受的。您还可以使用它构造的数据版本(即哪一天)标记缓存,从而加载新数据,忽略和/或清除缓存。所以内存缓存仍然是一种选择。
  2. 预先计算这个常见的中间结果(作为数据加载的一部分)并将其存储在数据库中,以便在每个控制器操作中从这个公共基础开始,然后执行特定于该确切操作的操作。
  3. 让您的客户做一个预先请求,作为其他请求的基础。在预先请求中,您计算​​公共基数,发出一个id,然后让其他操作接收此ID,从id加载计算的基数,并为最终结果执行特定于操作的计算。显然,这里的con是强制客户进入API的特定用途,但在您的情况下可能是可以接受的吗?
  4. 如果使用模式相当稳定 - 意味着经常一起调用API集合,只需要一个胖的API入口点来计算所需集合中每个操作的基础和所有细节,然后返回为一个大的结果,但因此只进行一次普通计算。
  5. 更具体的内容有助于提供更实际的答案。

答案 1 :(得分:0)

从我的理解你只需要存储calculatedValue somwhere!

如果只在同一次运行中需要它,你可以在静态全局变量中存储它, 如果用户之间的值不同,您也可以将其存储在会话中, 如果所有用户的值相同,则可以使用每次需要刷新calculatedValue时都会覆盖的文件;

因此,如果calculatedValue必须每天更改一次,那么您每天必须刷新一次