Safari有一个"功能",可以在您输入网址时预先加载页面.
现在对于大多数用户来说,这确实是一项功能,可以加快页面加载速度.但是对于Web开发人员来说,它可能会带来麻烦 - 特别是当它自动加载您之前使用但目前无意运行的脚本(如导入程序或后台脚本)时.
这种情况发生在Safari 8.x下,但旧版本也可能出现这种情况.
此外,请注意,此功能不同于"DNS预取",这是我遇到的唯一相关解释 - 我已禁用DNS预取,但未解决此问题...
在models.py中:
from django.db import models
...
class Product(models.Model):
...
recommended = models.ManyToManyField('self', blank=True)
...
Run Code Online (Sandbox Code Playgroud)
如果我有一个 Product 查询集,我怎样才能获得所有独特的推荐对象?
例如:产品«A»有3个推荐产品:«B»、«C»和«D»,产品«B»有2个推荐产品:«C»和«E»,在查询集«products»中,我们有«A»和 «B» 产品,在本例中:
# get_products() returns QuerySet of «A» and «B» products
products = get_products().prefetch_related('recommended')
recommended = [item for p in products for item in p.recommended.all()]
Run Code Online (Sandbox Code Playgroud)
我们会得到 [«B», «C», «D», «C», «E»] 的列表,但是如何只得到 [«B», «C», «D», «E»]?
PS当然我们可以在«for»循环中过滤对象,但也许有更有效和公平的方法?...
products = self.request.basket.get_products().prefetch_related(
Prefetch('recommended', queryset=models.Product.objects.distinct()))
recommended_list = [item for p in products for item in p.recommended.all()]
Run Code Online (Sandbox Code Playgroud)
返回:
[<Product: Vestibulum ante …Run Code Online (Sandbox Code Playgroud) 此处的 GCC 文档指定了 _buitin_prefetch 的用法。
第三个论点是完美的。若为0,编译器产生prefetchtnta(%rax)指令 若为1,编译器产生prefetcht2(%rax)指令 若为2,编译器产生prefetcht1(%rax)指令 若为3(默认),编译器产生prefetcht0 (%rax) 指令。
如果我们改变第三个参数,操作码已经相应地改变了。
但是第二个参数似乎没有任何效果。
__builtin_prefetch(&x,1,2);
__builtin_prefetch(&x,0,2);
__builtin_prefetch(&x,0,1);
__builtin_prefetch(&x,0,0);
Run Code Online (Sandbox Code Playgroud)
以上是生成的示例代码:
以下是组装:
27: 0f 18 10 prefetcht1 (%rax)
2a: 48 8d 45 fc lea -0x4(%rbp),%rax
2e: 0f 18 10 prefetcht1 (%rax)
31: 48 8d 45 fc lea -0x4(%rbp),%rax
35: 0f 18 18 prefetcht2 (%rax)
38: 48 8d 45 fc lea -0x4(%rbp),%rax
3c: 0f 18 00 prefetchnta (%rax)
Run Code Online (Sandbox Code Playgroud)
可以观察到第三个参数的操作码的变化。但即使我更改了第二个参数(指定读或写),汇编代码也保持不变。<27,2a> 和 <2e,31>。所以它不会向机器提供任何信息。那么第二个论点的目的是什么?
AMQ文档指出,建立连接时可以设置预取限制 - 有没有办法在实例化队列连接时使用stomp.py设置预取限制?
这里所述的_mm_prefetch调用将内容从RAM中的给定存储器位置预取到高速缓存行.但是缓存完全在硬件控制之下吗?基于经常访问的存储器(基于空间/时间位置),硬件将内容从存储器预取到高速缓存.我认为程序员无法控制缓存,它完全是一种硬件机制.
所以我的理解是错误的,缓存实际上可以由我们控制,对吧?
如果_mm_prefetch可以控制什么可以放在缓存中,
这是否意味着它永远不会从缓存中删除?
什么是等效的汇编级指令,它适用于缓存机制?
我试图矢量化循环,计算大浮点矢量的点积.我正在并行计算它,利用CPU拥有大量XMM寄存器的事实,如下所示:
__m128* A, B;
__m128 dot0, dot1, dot2, dot3 = _mm_set_ps1(0);
for(size_t i=0; i<1048576;i+=4) {
dot0 = _mm_add_ps( dot0, _mm_mul_ps( A[i+0], B[i+0]);
dot1 = _mm_add_ps( dot1, _mm_mul_ps( A[i+1], B[i+1]);
dot2 = _mm_add_ps( dot2, _mm_mul_ps( A[i+2], B[i+2]);
dot3 = _mm_add_ps( dot3, _mm_mul_ps( A[i+3], B[i+3]);
}
... // add dots, then shuffle/hadd result.
Run Code Online (Sandbox Code Playgroud)
我听说使用预取指令可以帮助加速,因为它可以"在后台"获取更多数据,同时执行muls并添加缓存中的数据.但是我没有找到关于如何使用_mm_prefetch()的示例和解释,何时使用什么地址和什么命中.你可以帮忙吗?
CPU使用分支预测来加速代码,但仅限于实际采用第一个分支.
为什么不简单地采取两个分支?也就是说,假设两个分支都将被命中,缓存两侧,并在必要时采取适当的分支.缓存不需要无效.虽然这需要编译器预先加载两个分支(更多的内存,适当的布局等),但我认为适当的优化可以简化两者,以便可以从单个预测器获得接近最优的结果.也就是说,需要更多的内存来加载两个分支(对于N个分支是指数的),大多数时候应该能够在完成执行分支之前足够快地用新代码"重新缓存"失败的分支. .
if(x)Bl else Br;
不假设采用Bl,而是假设采用Bl和Br(某种类型的并行处理或特殊交织),并且在实际确定分支之后,一个分支随后无效,然后可以释放缓存以供使用(可能是一些需要特殊技术的类型才能正确填写和使用它.
实际上,不需要预测电路,并且所有用于此的设计可以用于处理两个分支.
任何想法,如果这是可行的?
cpu cpu-architecture prefetch speculative-execution branch-prediction
我试图通过执行以下操作来降低我的复杂性。我正在努力让所有老师都进入活跃的课堂。
teacher/models.py:
Teacher(models.Model):
name = models.CharField(max_length=300)
classroom/models.py:
Classroom(models.Model):
name = models.CharField(max_length=300)
teacher = models.ForeignKey(Teacher)
students = models.ManyToManyField(Student)
status = models.CharField(max_length=50)
admin/views.py
teachers = Teacher.objects.prefetch_related(Prefetch('classroom_set',queryset=Classroom.objects.filter(status='Active'))
for teacher in teachers:
classrooms = teacher.all()
# run functions
Run Code Online (Sandbox Code Playgroud)
通过这样做,我让老师们有了教室。但它也会返回没有我不想要的活跃教室(空列表)的教师。正因为如此,我不得不用空的classroom_set来循环数千名教师。有什么办法可以删除那些classroom_set是[]的老师吗?
这是我的原始问题 - 带有外键的 Django 多个查询
谢谢
我的一个模型中有许多相关对象__str__。这使得管理站点运行速度非常慢。
即使没有明确请求,是否可以以始终执行 prefetch_lated 的方式设置模型?