如何优化该算法的速度?Django 和 JavaScript

我是 Javascript 新手,并且对 Django 有很好的经验。我为我的公司构建了一个图表平台来跟踪指标——它最初是作为学习 Javascript 的业余爱好项目,但后来演变成了更多东西。

该网站正确加载和显示数据,但在移动设备上速度慢得令人难以置信。所有的计算都是在客户端由JS完成。有很多指标需要计算,因此思考过程是“以对象格式向客户端发送所有 Django 查询,并在那里处理它们,以免减慢服务器速度。” 我也不希望有大量的代码块来处理服务器上的每个指标(我这样做是错误的吗?)。

这里有一些问题:

  • 一般来说,我应该在哪里处理数据,服务器端还是客户端?

  • 我该如何优化这段代码?我运行 3 个查询,需要查找每天每个指标的点击次数(页面浏览量、选择加入和计划调用)。

例如,我想显示一个图表,显示一个月内的页面浏览量,其中 x 轴是日期,y 轴是计数。为了做到这一点,我运行一个嵌套的 for 循环来迭代查询,然后计算该日期的页面浏览量。

当我针对三个不同的指标运行此函数时,速度非常慢。

数据通过 ajax 调用接收(这是最佳的吗?)。以下是计算当天点击次数的 Javascript 代码:

var endpoint = "/my/url/";

        var opt_ins = [];

        var schedules = [];

        var page_views = [];

        $.ajax({

            method: "GET",

            url: endpoint,

            success: function (data) {

                opt_ins = data.opt_ins;

                schedules = data.audit_calls;

                page_views = data.page_views;

            },

            error: function (error) { console.log("ERROR -->  " + error); },

            async: false

        });



async function getDateCounts(data) {

            dates = [];

            count_dates = [];

            let i = 0;

            for (const element of data) {

                let date = new Date(element.date_created).toLocaleDateString("en-US");

                if (!dates.includes(date)) {

                    dates.push(date);

                    let count = 0;

                    for (const item of data) {

                        let check_date = new Date(item.date_created).toLocaleDateString("en-US");

                        if (check_date === date) {

                            count++;

                        }

                    }

                    count_dates.push(count);

                    count = 0;

                }

            }

            return [dates, count_dates];

每个查询都会返回一个不同长度的对象。

以下是包含示例数据的最终图表的示例


胡子哥哥
浏览 51回答 1
1回答

qq_笑_17

数据库是聚合这些数据的好地方,并将减少需要传递的数据量。该aggregate()方法将使您获得如下数据集:[{'date':COUNT},{'date':COUNT},...]TruncDate()如果您有日期时间,则允许按天分组。from django.db.models import Sumfrom django.db.models.functions import TruncDatemodels.AgentPageViews.objects.filter(date_created__gt=self.time_period).    values(date=TruncDate('date_created')).    order_by("date_created").annotate(Sum('views')
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript