我正在用Java编写一些代码,在某些时候,程序的流程是由两个int变量"a"和"b"是否为非零来确定的(注意:a和b从不是负数,并且从不在整数溢出范围内).
我可以评估它
if (a != 0 && b != 0) { /* Some code */ }
Run Code Online (Sandbox Code Playgroud)
或者
if (a*b != 0) { /* Some code */ }
Run Code Online (Sandbox Code Playgroud)
因为我希望每段代码运行数百万次,所以我想知道哪一段会更快.我通过在一个巨大的随机生成的数组上进行比较来做实验,我也很想知道数组的稀疏性(数据的分数= 0)会如何影响结果:
long time;
final int len = 50000000;
int arbitrary = 0;
int[][] nums = new int[2][len];
for (double fraction = 0 ; fraction <= 0.9 ; fraction += 0.0078125) {
for(int i = 0 ; i < 2 ; i++) {
for(int j = 0 ; j < len ; j++) …
Run Code Online (Sandbox Code Playgroud) java performance processing-efficiency microbenchmark branch-prediction
在这段代码中:
if (value >= x && value <= y) {
Run Code Online (Sandbox Code Playgroud)
什么时候value >= x
和value <= y
没有特定模式的情况一样真假,使用&
运算符会比使用更快&&
吗?
具体来说,我正在考虑如何&&
懒惰地评估右侧表达式(即,仅当LHS为真),这意味着条件,而&
在此上下文中的Java 保证严格评估两个(布尔)子表达式.值结果是相同的两种方式.
不过,虽然一个>=
或<=
运营商将使用一个简单的比较指令时,&&
必须包括一个分支,该分支是易受分支预测失败 -按本非常著名的问题:为什么快处理有序数组不是一个排序的数组?
因此,强制表达式没有惰性组件肯定会更具确定性,并且不容易受到预测失败的影响.对?
笔记:
if(value >= x && verySlowFunction())
.我专注于"足够简单"的RHS表达.if
声明).我无法向自己证明这是无关紧要的,而且替代配方可能是更好的例子,比如boolean b = value >= x && value <= y;
更新 只是为了解释为什么我感兴趣:我一直在盯着马丁汤普森在他的机械同情博客上撰写的系统,在他来到并谈到 Aeron之后.其中一个关键信息是我们的硬件中包含了所有这些神奇的东西,我们的软件开发人员不幸地无法利用它.别担心,我不打算在我的所有代码上使用///// :-) ...但是这个网站上有很多关于通过删除分支来改进分支预测的问题,并且它发生了对我来说,条件布尔运算符是测试条件的核心.
当然,@ StephenC提出了一个奇妙的观点,即将代码弯曲成奇怪的形状可以使JIT更容易发现常见的优化 - 如果不是现在,那么将来也是如此.并且上面提到的非常着名的问题是特殊的,因为它推动预测复杂性远远超出实际优化. …
java performance processing-efficiency microbenchmark branch-prediction
我想定义一个有效的整数下限函数,即从float或double转换为向负无穷大执行截断。
我们可以假设这些值使得没有整数溢出发生。到目前为止,我有一些选择
转换为int 这需要对负值进行特殊处理,因为转换会截断为零。
I= int(F); if (I < 0 && I != F) I--;
Run Code Online (Sandbox Code Playgroud)将floor的结果转换为int;
int(floor(F));
Run Code Online (Sandbox Code Playgroud)强制转换为int以获得较大的正数(对于较大的值,这可能会返回错误的结果);
int(F + double(0x7fffffff)) - 0x7fffffff;
Run Code Online (Sandbox Code Playgroud)众所周知,将数据类型转换为int很慢。如果测试也是如此。我尚未设置发言权功能的时间,但是看到帖子声称它也很慢。
您能在速度,准确性或允许范围方面考虑更好的替代方法吗?它不需要是便携式的。目标是最新的x86 / x64体系结构。
问题:给定一个未排序的正整数数组,是否有可能从该数组中找到一对总和达到给定总和的整数?
约束:这应该在O(n)和就地(没有任何外部存储,如数组,哈希映射)完成(你可以使用额外的变量/指针)
如果这是不可能的,那么可以给出相同的证明吗?
我有一个处理DataFrame的函数,主要是将数据处理成桶,在特定列中使用创建二进制矩阵的特征pd.get_dummies(df[col])
.
为了避免一次使用此函数处理我的所有数据(内存不足并导致iPython崩溃),我使用以下方法将大型DataFrame分解为块:
chunks = (len(df) / 10000) + 1
df_list = np.array_split(df, chunks)
Run Code Online (Sandbox Code Playgroud)
pd.get_dummies(df)
会自动创建一个基于内容的新栏目df[col]
和这些都有可能为每个不同df
在df_list
.
处理完毕后,我使用以下方法将DataFrame连接在一起:
for i, df_chunk in enumerate(df_list):
print "chunk", i
[x, y] = preprocess_data(df_chunk)
super_x = pd.concat([super_x, x], axis=0)
super_y = pd.concat([super_y, y], axis=0)
print datetime.datetime.utcnow()
Run Code Online (Sandbox Code Playgroud)
第一个块的处理时间是完全可以接受的,然而,它每块增长!这与它没有关系,preprocess_data(df_chunk)
因为没有理由增加它.由于呼叫的结果,是否会增加时间pd.concat()
?
请参阅下面的日志:
chunks 6
chunk 0
2016-04-08 00:22:17.728849
chunk 1
2016-04-08 00:22:42.387693
chunk 2
2016-04-08 00:23:43.124381
chunk 3
2016-04-08 00:25:30.249369
chunk 4
2016-04-08 00:28:11.922305
chunk 5
2016-04-08 00:32:00.357365 …
Run Code Online (Sandbox Code Playgroud) python performance concatenation processing-efficiency pandas
对于有用户的网站.每个用户都有能力创建任何数量的,我们称之为"帖子":
效率方面 - 最好为所有帖子创建一个表,为每个帖子保存创建帖子的用户的用户ID - 或者为每个用户创建一个不同的单独表,并只创建帖子那个用户?
题:
访问堆栈的速度与访问内存的速度相同吗?
例如,我可以选择在堆栈中做一些工作,或者我可以直接使用内存中的标记位置工作.
所以,具体来说:push ax
速度是一样的mov [bx], ax
吗?同样pop ax
的速度是一样的mov ax, [bx]
?(假设bx在near
内存中占有一个位置.)
问题的动机:
在C中常见的是阻止带参数的琐碎函数.
我一直认为这是因为不仅必须将参数压入堆栈,然后在函数返回后弹出堆栈,还因为函数调用本身必须保留CPU的上下文,这意味着更多的堆栈使用.
但假设有人知道标题问题的答案,那么应该可以根据相同数量的直接内存访问来量化函数用于设置自身的开销(推/弹/保存上下文等).因此标题问题.
near
上面使用的是与16位x86架构far
的分段内存模型相反.) 通过UDP发送大量数据包会占用更多资源(cpu,zlib压缩等).我在这里读到,通过UDP发送一个大约65kBYTE的数据包可能会失败所以我认为发送大量较小的数据包会更频繁地成功,但随后会产生使用更多处理能力的计算开销(或者至少就是我的我假设).问题基本上是这样的; 发送最大成功数据包并将计算量降至最低的最佳方案是什么?是否有特定尺寸可以在大多数时间使用?我使用Erlang作为服务器,使用Enet作为客户端(用c ++编写).也使用Zlib压缩,我向每个客户端发送相同的数据包(广播是我猜的术语).
摘要
我想尽快写一个.png文件,而不用考虑压缩.也就是说,我不太关心文件大小,但我确实关心写入是否尽快发生.
动机
我正在使用客户端的OpenLayers和后端的python/C++创建基于Web的地图应用程序.当用户在地图上移动时,应用程序需要能够快速绘制动态内容.我有基于图块(256x256图块)和单图像("单图块")版本的工作,但在这两种情况下,后端渲染的最慢部分实际上是将图像保存为png文件(无论是否-disk或in-memory).例如,我可以在大约200毫秒内生成某个视图的"原始","tga"或"tiff"版本,但生成.png版本需要更多的时间,因为.png保存需要几乎整整一秒,而实际保存其他格式的时间是100毫秒或更短(即使"原始"文件是.png文件大小的五倍).此文件节省的时间也远远超过将结果图像从服务器传输到客户端的时间.(我的应用程序的一个重要特性是,通常"后端"将与浏览器在同一台机器上运行,因此传输时间可以忽略不计,即使对于大文件也是如此.)
我以为我可以通过调用快速编写.png(在使用C++中的libpng时)
png_set_compression_level( png_ptr, 0 );
Run Code Online (Sandbox Code Playgroud)
在调用任何png_write_...
函数之前.但是,虽然该调用确实似乎阻止了libpng压缩文件(生成的文件大小与.raw文件大小相同),但它并没有使.png的保存速度明显加快.
请帮忙
我需要为这些图像使用.png,因为我需要它们是基本地图顶部的透明叠加层,我需要的不仅仅是GIF提供的256种颜色.OpenLayers只是使用html img标签,所以我的理解是我只能使用有效的img格式.
我认为有一种方法可以通过不进行任何实际压缩来快速编写.png文件(我知道.png是"始终压缩"但我想这可能包括"空压缩").看起来你应该能够编写一个简单的固定标题,然后是未压缩的数据,然后是一些固定的页脚.或者也许是相同的想法,但是以逐行的方式.关键是我可以非常快速地在内存中通过这个2.5 MB的原始数据循环进行各种循环,并且可以非常快速地将其转储到各种文件格式,所以看起来我应该能够将它转储到固定的,未压缩的.png格式也很快.
听起来不错吗?你知道在哪里可以找到代码的例子吗?
从具有实际经验的任何人那里,如果字段具有普通的INDEX,LIKE查询在数百万行表中如何在速度和效率方面执行?
对数百万行表执行数据库字段搜索是否有更好的替代方法(不会过滤结果,如FULLTEXT 50%规则)?
例:
Schema (comments table)
id (PRIMARY) title(INDEX) content time stamp
Query
SELECT * FROM 'comments' WHERE 'title' LIKE '%query%'
Run Code Online (Sandbox Code Playgroud)