- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
问题设置介绍
我正在做一些基准测试,涉及 - ~A
和 A==0
对于 没有 NaN 的 double 组
,它们都转换A
到逻辑数组,其中所有 zeros
都转换为 true
值,其余设置为 false
值。
对于基准测试,我使用了三组输入数据 –
15:5:100
50:40:1000
200:400:3800
输入是使用 A = round(rand(N)*20)
创建的,其中 N 是从大小数组中获取的参数。因此,对于第一组,N
将从 15 到 100 变化,步长为 5
,第二组和第三组也类似。请注意,我将数据大小定义为 N,因此元素的数量将是数据大小^2 或 N^2。
基准代码
N_arr = 15:5:100; %// for very small to small sized input array
N_arr = 50:40:1000; %// for small to medium sized input array
N_arr = 200:400:3800; %// for medium to large sized input array
timeall = zeros(2,numel(N_arr));
for k1 = 1:numel(N_arr)
A = round(rand(N_arr(k1))*20);
f = @() ~A;
timeall(1,k1) = timeit(f);
clear f
f = @() A==0;
timeall(2,k1) = timeit(f);
clear f
end
结果
最后是问题
可以看出 A==0
在所有数据大小上的表现如何优于 ~A
。所以这里有一些观察结果和相关的问题——
A==0
有一个关系运算符和一个操作数,而 ~A
只有一个关系运算符。两者都产生逻辑数组并且都接受 double 组。事实上,A==0
也适用于 NaN
,而 ~A
则不行。那么,为什么 ~A
至少不如 A==0
好,因为看起来 A==0
做了更多的工作还是我在这里遗漏了什么?
A==0
的运行时间有一个奇特的下降,因此在 N = 320
时提高了性能,即在 102400
> A 的元素。我在我有权访问的两个不同系统上以该大小运行的许多次中都观察到了这一点。那么那里发生了什么?
最佳答案
这不是严格意义上的答案,而是我对讨论的贡献
我使用 profiler
来调查您的代码的一个稍微修改过的版本:
N_arr = 200:400:3800; %// for medium to large sized input array
for k1 = 1:numel(N_arr)
A = randi(1,N_arr(k1));
[~]=eq(A,0);
clear A
A = randi(1,N_arr(k1));
[~]=not(A);
clear A
end
我使用了以下分析器标志(根据 UndocumentedMatlab's series of posts about Profiler
):
profile('-memory','on');
profile('on','-detail','builtin');
下面是探查器结果的摘录 (link to the larger image):
似乎 ==
变体分配了一点额外的内存,使其能够发挥其魔力....
关于您的问题 2:在删除保留 timeall
之前,我尝试绘制您在 Excel 中绘制的相同图表。我没有观察到您为 N = 320
提到的行为。我怀疑这可能与您在代码中使用的额外包装器(即函数句柄)有关。
我想我应该附上所讨论函数的可用文档以供快速引用。
~
(\MATLAB\R20???\toolbox\matlab\ops\not.m) 的文档:
%~ Logical NOT.
% ~A performs a logical NOT of input array A, and returns an array
% containing elements set to either logical 1 (TRUE) or logical 0 (FALSE).
% An element of the output array is set to 1 if A contains a zero value
% element at that same array location. Otherwise, that element is set to
% 0.
%
% B = NOT(A) is called for the syntax '~A' when A is an object.
%
% ~ can also be used to ignore input arguments in a function definition,
% and output arguments in a function call. See "help punct"
% Copyright 1984-2005 The MathWorks, Inc.
==
(\MATLAB\R20???\toolbox\matlab\ops\eq.m) 的文档:
%== Equal.
% A == B does element by element comparisons between A and B
% and returns a matrix of the same size with elements set to logical 1
% where the relation is true and elements set to logical 0 where it is
% not. A and B must have the same dimensions unless one is a
% scalar. A scalar can be compared with any size array.
%
% C = EQ(A,B) is called for the syntax 'A == B' when A or B is an
% object.
% Copyright 1984-2005 The MathWorks, Inc.
关于arrays - A==0 真的比 ~A 好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25339215/
我是一名优秀的程序员,十分优秀!