Comme je l'ai été jouer avec un rapide tutoriel, j'ai commencé à écrire une coutume isPrime
méthode pour vérifier si un Int
est premier ou non.
Après l'avoir écrit, j'ai réalisé qu'il a été fonctionne correctement mais le trouve un peu lent à accomplir isPrime
sur certains assez grand nombre (encore beaucoup plus faible alors Int.max
).
J'ai donc écrit le même morceau de code dans objc et le code a été exécuté beaucoup plus rapide (d'un facteur de 66 fois le niveau).
Voici le code swift:
class Swift {
class func isPrime(n:Int) -> Bool {
let sqr : Int = Int(sqrt(Double(n))) + 1
for i in 2...sqr {
if n % i == 0 {
return false
}
}
return true;
}
class func primesInRange(start:Int, end:Int) -> Int[] {
var primes:Int[] = Int[]()
for n in start...end {
if self.isPrime(n) {
primes.append(n)
}
}
return primes;
}
}
Et l'objc code:
@implementation Utils
+ (BOOL)isPrime:(NSUInteger)n {
NSInteger sqr = (NSUInteger)(sqrt(n))+1;
for (NSUInteger i = 2; i < sqr; ++i) {
if (n % i == 0) {
return false;
}
}
return YES;
}
+ (NSArray*)primesInRange:(NSUInteger)start end:(NSUInteger)end {
NSMutableArray* primes = [NSMutableArray array];
for (NSUInteger i = start; i <= end; ++i) {
if ([self isPrime:i])
[primes addObject:@(i)];
}
return primes.copy;
}
@end
Et dans main.swift
:
let startDateSwift = NSDate.date()
let swiftPrimes = Swift.primesInRange(1_040_101_022_000, end: 1_040_101_022_200)
let elapsedSwift = NSDate.date().timeIntervalSinceDate(startDateSwift)*1000
let startDateObjc = NSDate.date()
let objcPrimes = Utils.primesInRange(1_040_101_022_000, end: 1_040_101_022_200)
let elapsedObjc = NSDate.date().timeIntervalSinceDate(startDateObjc)*1000
println("\(swiftPrimes) took: \(elapsedSwift)ms");
println("\(objcPrimes) took: \(elapsedObjc)ms");
Ce produit:
[1040101022027, 1040101022039, 1040101022057, 1040101022099, 1040101022153] took: 3953.82004976273ms
[1040101022027, 1040101022039, 1040101022057, 1040101022099, 1040101022153] took: 66.4250254631042ms
Je sais que j'aurais pu utiliser un extension
sur Int
ici pour vérifier si un nombre est premier, mais je voulais à la fois le code pour être très similaires.
Quelqu'un peut-il me dire pourquoi ce code swift est beaucoup plus lent? Le 66 fois le niveau de facteur est assez effrayant et ne fait que s'aggraver comme je l'incrément de la gamme.