2

我遇到(非常)缓慢的页面加载时间,该时间与系统上的活跃用户数量成正比。我有一种预感,这与自定义定义的线程对象有关:

define stageStoreCache => thread {
    parent map
    public oncreate() => ..oncreate()
}

stageStoreCache对象只是模仿地图的行为,其数据在整个实例中都可用。

许多线程正在读取它,而很少有线程正在写入它。对于在整个实例中提供大量数据地图,这是一个构思不佳的解决方案吗?这是一张相当大的地图,导出时map->asstring可以超过 5MB。目的是防止将数据库中存储为 JSON 的数据动态转换为 Lasso 类型。

似乎大尺寸stageStoreCache并不是导致问题的原因。它似乎真的是系统上的并发用户数。

感谢您提供的任何见解。

4

2 回答 2

1

你说这有一张地图,而且相当大。如果这些子图很大,则可能是您访问数据的方式导致了问题。这就是我的意思,如果你正在做这样的事情:

// Potential problem as it copies the sub-map each time
stageStoreCache->find('sub-map')->find('data')
stageStoreCache->find('sub-map')->find('other')

问题在于,每次stageStoreCache->find('sub-map')调用它实际上都必须将它为“子地图”找到的所有地图数据从线程对象复制到请求该数据的线程中。如果这些子图很大,这需要时间。更好的方法是执行一次并将其存储在局部变量中:

// Better Approach
local(cache) = stageStoreCache->find('sub-map')
#cache->find('data')
#cache->find('other')

这至少只需要复制一次“子地图”。另一种可能更好的方法(只有测试才能知道)是重构您的代码,以便对 stageStoreCache 的每次调用都会深入到您实际想要的数据,并且只复制少量数据。

// Might even be better as it just copies the values you want
stageStoreCache->drill('sub-map', 'data')
stageStoreCache->drill('sub-map', 'other')

最终,我希望Lasso改进线程对象,使它们永远不会阻塞读取。(我原以为这是作为功能请求提交的,但我在 Rhinotrac 上没有找到它。)在此之前,如果我的建议都没有帮助,那么您可能需要使用其他东西进行调查以缓存这些数据,例如内存缓存。

于 2015-01-13T21:50:25.617 回答
1

测试是唯一可以确定的方法。但我会采取很长的方法来避免拥有一个包含大约 5 MB 数据的线程对象。

考虑 Lasso 指南中的这个片段:“复制给线程对象方法的所有参数值,以及线程对象方法的任何返回值” http://www.lassoguide.com/language/threading.html 这意味着让 Lasso 9 如此快速的关键功能之一,即广泛使用参考数据的功能丢失了。

每次调用 stageStoreCache 时,它​​包含的所有数据都将首先复制到请求它的线程中。那是大量的复制。

我发现将设置和站点范围的数据包含在尽可能小的块中既方便又快捷。而且,仅在需要时才实际设置它。与在每次调用中都包含一个配置文件的旧方法不同,设置一堆变量,其中大多数变量可能永远不会在该特定调用中使用。这是我正在使用的 Ke 技巧。考虑一下:

define mysetting1 => var(__mysetting1) || $__mysetting1 := 'Setting 1 value'
define mysetting2 => var(__mysetting2) || $__mysetting2 := 'Setting 2 value'
define mysetting3 => var(__mysetting3) || $__mysetting3 := 'Setting 3 value'

让这是一个在启动时读取的文件,无论是在启动的 LassoApp 中还是在启动文件夹中的文件中。

然后可以像这样调用这些设置:

code blabla
mysetting2
more code blabla
mysetting1
mysetting2

在这种情况下,没有浪费的处理来启动 mysetting3,因为它不是必需的。并且 mysetting2 被调用了几次,但仍然只启动了一次。

这种技术可以用于上述简单的事情,也可以用于启动复杂的类型或方法。像会话管理、调用 post 或 get params 等。

于 2015-01-13T22:53:13.643 回答