Введение в настройку проблемы
Я делал некоторые тесты, связанные с ~A
и A==0
для double array with no NaNs
, оба из которых конвертируют A
в логический массив, где все zeros
преобразуются в значения true
, а остальные устанавливаются как false
.
Для бенчмаркинга я использовал три набора входных данных -
- Очень маленькие и мелкие данные -
15:5:100
- Данные малого и среднего размера -
50:40:1000
- Средние и большие данные -
200:400:3800
Вход создается с помощью A = round(rand(N)*20)
, где N - параметр, взятый из массива размера. Таким образом, N
будет меняться от 15 to 100 with stepsize of 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
имеет только один реляционный оператор. Оба производят логические массивы и оба принимают двойные массивы. Фактически,A==0
будет работать сNaNs
тоже, если~A
не будет. Итак, почему все еще~A
по крайней мере не так хорошо, какA==0
, поскольку он выглядит так:A==0
делает больше работы или я что-то пропустил здесь? -
Это своеобразное падение прошедшего времени с
A==0
и, таким образом, увеличение производительности приN = 320
, т.е. в102400
для элементов A. Я наблюдал это во многих прогонах с этим размером на двух разных системах, У меня есть доступ. Так что происходит там?