Почему «<=numeric_limits::max()» быстрее, чем «<numeric_limits::max()»?

#c #algorithm

Вопрос:

Я делаю код 322,использую coin <= numeric_limits<int>::max() вместо coin < numeric_limits<int>::max() того, чтобы уменьшить 12 мс, но я не могу понять, почему?

решение на 64 мс:

 class Solution {
public:
    int coinChange(vector<int>amp; coins, int amount) {
        vector<int> dp(amount 1, numeric_limits<int>::max());

        dp[0] = 0;
        for(int i = 0; i <= amount;   i){
            if(dp[i] != numeric_limits<int>::max())
            for(const auto amp;coin : coins){
                if(coin <= numeric_limits<int>::max() - i amp;amp; i   coin <= amount)
                dp[i   coin] = min(dp[i   coin], dp[i]   1);
            }
        }
        return dp[amount] == numeric_limits<int>::max() ? -1 : dp[amount];
    }
};
 

решение 76ms:

 class Solution {
public:
    int coinChange(vector<int>amp; coins, int amount) {
        vector<int> dp(amount 1, numeric_limits<int>::max());

        dp[0] = 0;
        for(int i = 0; i <= amount;   i){
            if(dp[i] != numeric_limits<int>::max())
            for(const auto amp;coin : coins){
                if(coin < numeric_limits<int>::max() - i amp;amp; i   coin <= amount)
                dp[i   coin] = min(dp[i   coin], dp[i]   1);
            }
        }
        return dp[amount] == numeric_limits<int>::max() ? -1 : dp[amount];
    }
};
 

Комментарии:

1. Разница в 12 мс, скорее всего, будет вызвана случайным совпадением.

2. Тайминги, о которых сообщает Leetcode, слабо коррелируют с фактической производительностью; время суток является лучшим предиктором отображаемой среды выполнения. При повторном запуске ваших 2 образцов кода эффект был обратным: я получил 115 мс и 87 мс. Я бы рекомендовал использовать вашу собственную машину для сравнительного анализа; в противном случае скептически относитесь ко всему, что ниже огромной разницы во времени (аддитивной и мультипликативной) с удаленного интернет-сервера, о котором у вас мало информации.

3. если вы хотите создать код микробенчмарка, а) сделайте это локально б) используйте библиотеку, предназначенную для этого (которая будет запускать код много раз и т.д.) в) имейте в виду, что микробенчмарк очень сложен, так как компиляторы все более умны в оптимизации кода (а также случайные вещи, выполняемые на вашей машине, могут повлиять на время, например, проверка на антивирус или что-либо еще)