Введение в настройку проблемы
Я делал некоторые тесты, связанные с ~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. Я наблюдал это во многих прогонах с этим размером на двух разных системах, У меня есть доступ. Так что происходит там?

