Почему скорость работы с массивами в Swift ниже? - PullRequest
2 голосов
/ 06 октября 2019

Когда я пытаюсь решить проблему в Leetcode 1208 , я замечаю, что код Swift намного медленнее, чем Objective-C.

Вот мой код в Swift:

func equalSubstring(_ s: String, _ t: String, _ maxCost: Int) -> Int {
    let list = zip(s,t).map { $0 }
    var costList = [Int].init(repeating: 0, count: list.count)
    for item in list.enumerated() {
        costList[item.offset] = abs(Int(item.element.0.asciiValue!) - Int(item.element.1.asciiValue!))
    }

    var maxLen = 0
    for i in 0..<costList.count {
        var len = 0, cost = maxCost
        for j in i..<costList.count {
            cost -= costList[j]
            if cost >= 0 {
                len += 1
            } else {
                break
            }
        }
        if len > maxLen {
            maxLen = len
        }
    }

    return maxLen
}

Требуется 496,363 секунды, чтобы справиться с вводом длины 100000 с maxCost 93020. Контрольный пример

Но если я использую тот же подход в Objective-C, это займет всего 19 с:

- (int)equalSubstring:(NSString *)s t:(NSString *)t maxCost:(int)maxCost {
    NSMutableArray *costList = [[NSMutableArray alloc] init];
    for (int i=0; i<s.length; i++) {
        [costList addObject:@(abs([s characterAtIndex:i] - [t characterAtIndex:i]))];
    }

    int maxLen = 0;
    for (int i=0; i<costList.count; i++) {
        int cost = maxCost, len = 0;
        for (int j=i; j<costList.count; j++) {
            cost -= [costList[j] intValue];
            if (cost >= 0) {
                len += 1;
            } else {
                break;
            }
        }
        if (len > maxLen) {
            maxLen = len;
        }
    }

    return maxLen;
}

в Javascript будет еще быстрее:

var equalSubstring = function(s, t, maxCost) {

    var maxLength = 0;
    for (var i=0; i<s.length; i++) {
        var cost = maxCost, len = 0;
        for (var j=i; j<s.length; j++) {
            let c = Math.abs(s.charCodeAt(j) - t.charCodeAt(j));
            cost -= c;
            if (cost >= 0) {
                len += 1;
            } else {
                break;
            }
        }
        if (len > maxLength) {
            maxLength = len;
        }
    }

    return maxLength;
};

В чем может быть причина того, что Swift так медлителен? Проблема будет в самом языке?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...