有没有人有使用 Core 2 Duo 处理器的预取指令的经验?
我一直在为一系列 P4 机器成功使用(标准?)预取集(prefetchnta、prefetcht1等),但是在 Core 2 Duo 上运行代码时,prefetcht(i)指令似乎什么都不做,而且prefetchnta指令更少有效的。
我评估性能的标准是 BLAS 1 向量向量 (axpy) 操作的计时结果,当向量大小足以实现缓存外行为时。
英特尔是否引入了新的预取指令?
html5链接预取属性是否会导致访问计入Google Analytics中的预取页面?
<link rel="prefetch" href="http://someurl.com/page.htm" />
关于跟踪预取的AJAX内容的这个问题是类似的,但<link>标签是没有任何Javascript的浏览器解释,它是按浏览器实现的.
我正在开发具有逻辑上一页和下一页内容的网站.该应用程序依次浏览网站,培训课程或在线宣传册.
某些体系结构具有“预取写入”指令,以在您实际执行之前向 CPU 指示您将要写入内存位置。我知道在多核机器上,这可以被内核用作暗示它现在应该尝试获取给定缓存行的所有权,以便以后可以更快地写入该位置。但是,AFAICT 仅在有两个内核可能争用缓存线的情况下才重要。对于仅由单核读取和写入的缓存线,预取写入有任何用处吗?
Firefox 似乎预取在元标记中设置的任何内容,如下所示:
<link rel="next" href="http://domain.com/page/2">
Run Code Online (Sandbox Code Playgroud)
可以在此处阅读有关此内容的更多信息:http : //developer.mozilla.org/en-US/docs/Link_prefetching_FAQ
现在在我的网站上,当有多个页面用于评论时,我一直在使用 rel="next" 和 rel="previous",因为我认为这是很好的标记,可以用来帮助某些读者或搜索引擎机器人。
然而,我也一直试图跟踪用户阅读的最后一条评论是什么,但这并没有奏效(当你花了几个小时做一些简单的事情时,这是愚蠢的时间之一)。
基本上,例如,当用户读取第 2 页(共 3 页)时,我更新数据库以表示他们已读取第 2 页,但未读取第 3 页。但是,由于第 3 页被预取,该页的代码会运行,并且会触发 SQL 更新即使用户从未真正阅读过第 3 页,该页面也是如此。
所以我真的有几个问题:
使用Oracle java JDBC(ojdbc14 10.2.x),加载具有多行的查询需要永远(高延迟环境.显然,Oracle JDBC中的默认预取是默认大小"10",这需要每10行一次往返时间.我试图设置一个积极的预取大小,以避免这种情况.
PreparedStatement stmt = conn.prepareStatement("select * from tablename");
statement.setFetchSize(10000);
ResultSet rs = statement.executeQuery();
Run Code Online (Sandbox Code Playgroud)
这可以工作,但我得到一个内存不足的例外.我曾经假设setFetchSize会告诉它在它们进入时缓冲"那么多行",使用每行所需的RAM.如果我运行50个线程,即使使用16G的-XMX空间,它也会耗尽内存.感觉几乎像泄漏:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.lang.reflect.Array.newArray(Native Method)
at java.lang.reflect.Array.newInstance(Array.java:70)
at oracle.jdbc.driver.BufferCache.get(BufferCache.java:226)
at oracle.jdbc.driver.PhysicalConnection.getCharBuffer(PhysicalConnection.java:7422)
at oracle.jdbc.driver.OracleStatement.prepareAccessors(OracleStatement.java:983)
at oracle.jdbc.driver.T4CTTIdcb.receiveCommon(T4CTTIdcb.java:273)
at oracle.jdbc.driver.T4CTTIdcb.receive(T4CTTIdcb.java:144)
at oracle.jdbc.driver.T4C8Oall.readDCB(T4C8Oall.java:771)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:346)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:521)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:205)
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:861)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1145)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1267)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3449)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3493)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1491)
....
Run Code Online (Sandbox Code Playgroud)
我还能做些什么来获取预取但不会耗尽RAM?到底是怎么回事?
SO上最接近的相关项目是:https://stackoverflow.com/a/14317881/32453
我的 Django 应用程序中有当前模型:
class Referentiel(models.Model):
code = models.CharField(max_length=50)
libelle = models.CharField(max_length=100)
class Reference(models.Model):
referentiel = models.ForeignKey('Referentiel', related_name='reference_set')
clef = models.CharField(max_length=50)
class ValeurReference(models.Model):
reference = models.ForeignKey('Reference', related_name='valeur_set')
valeur = models.DecimalField(max_digits=15, decimal_places=5)
date_fin = models.DateField(blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)
我希望检索 Referentiel 的值,所以我做这样的事情:
Referentiel.objects.filter(code='whatever_code').prefetch_related(Prefetch('reference_set__valeur_set', to_attr='valeurs'))
Run Code Online (Sandbox Code Playgroud)
但是在尝试获取我的值时出现以下错误:
AttributeError: 'Referentiel' object has no attribute 'valeurs'
Run Code Online (Sandbox Code Playgroud)
Django 版本:1.7.4 Python 版本:3.4.2
感谢您的任何建议。
我有以下的代码,预取和预呈现*悬停特定链接,我的问题是,我需要添加每次新的链接,还是不多,所以我改变了href?
$(".prerender").on("mouseover", function() {
var link = $(this).attr("href"),
prerenderLink = $("#prerenderLink");
if (prerenderLink.length) {
if (prerenderLink.attr("href") === link) return;
prerenderLink.attr("href", link);
} else {
$('<link id="prerenderLink" rel="prefetch prerender" href="' + link + '" />').appendTo("body");
}
});
Run Code Online (Sandbox Code Playgroud)
删除、更改是否会href取消先前定义的预渲染/预取,href甚至将其从缓存中删除?或者因为它一旦留在缓存中就被调用了?
另外,哪里可以测试?
*因为预渲染是一项高级实验性功能,错误触发它会导致用户体验下降,包括带宽使用增加、其他链接加载速度变慢以及内容略显陈旧。如果您对用户接下来将访问哪个页面有很高的信心,并且您确实为用户提供了附加值,那么您应该只考虑触发预呈现。
有没有人尝试通过使用preload或成功地减少 Typekit 的加载时间prefetch?IE
<link rel='preload' href='...' as='font'>
<!-- and/or -->
<link rel='prefetch' href='...'>
Run Code Online (Sandbox Code Playgroud)
在当前的 Typekit 加载设置中它是实用的还是可能的?
假设我有以下模型
class Foo(models.Model):
...
class Prop(models.Model):
...
class Bar(models.Model):
foo: models.ForeignKey(Foo, related_name='bars', ...)
prop: models.ForeignKey(Prop, ...)
Run Code Online (Sandbox Code Playgroud)
现在我想进行以下查询。
foos = Foo.objects.prefetch_related('bars__prop').all()
Run Code Online (Sandbox Code Playgroud)
确实上述查询使得3级数据库的呼叫或仅2(select_related用于prop从bar),因为只有一个prop与之相关联bar
如果需要 3 次调用,有没有办法通过使用 selected_related for bar -> prop
我在 django 项目(v2.1.4)中有一个相对复杂的模型结构。让我们说:
class Pizza(models.Model):
pass
class ToppingPlacedOnPizza(models.Model):
# Breaks a many-to-many relationship between Pizza and Topping and stores specific data
# like the position of the topping in the pizza
pizza = models.ForeignKey(Pizza, related_name='placed_toppings')
topping = models.ForeignKey(Topping)
# position ...
class Topping(models.Model):
brand = models.ForeignKey(Brand)
class Brand(models.Model):
name = models.CharField(max_length=32)
Run Code Online (Sandbox Code Playgroud)
我需要检索为一组比萨饼中的每个比萨饼制作配料的品牌的所有名称。说:
pizza1: brand1, brand2, brand3
pizza2: brand2, brand4
...
Run Code Online (Sandbox Code Playgroud)
这样做,prefetch_related对提高性能有很大帮助:
pizzas.prefetch_related('placed_toppings__topping__brand')
Run Code Online (Sandbox Code Playgroud)
但是当查询大约 1000 个比萨时,它开始变得非常慢。根据这个 stackoverflow answer,使用Prefetchclass 并to_attr可以提高性能,但我无法让它在我的情况下工作。to_attr由于嵌套查找,不清楚哪个对象将写入新属性。
我做to_attr …