当前位置: 首页 > 知识库问答 >
问题:

斯威夫特处理数字真的很慢吗?

宗政唯
2023-03-14

在使用swift教程时,我开始编写一个自定义的isPrime方法来检查给定的int是否为素数。

在编写完它之后,我意识到它工作正常,但发现在一些相当大的数字上执行isprime有点慢(仍然比int.max)。

所以我用objc编写了相同的代码,并且代码的执行速度快得多(是66倍)。

以下是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;
    }
}

和对象代码:

@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

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");

这就产生了:

[1040101022027, 1040101022039, 1040101022057, 1040101022099, 1040101022153] took: 3953.82004976273ms
[1040101022027, 1040101022039, 1040101022057, 1040101022099, 1040101022153] took: 66.4250254631042ms

共有1个答案

楚意
2023-03-14

以下是Swift编译器代码生成的优化级别(您可以在构建设置中找到它们):

[-Onone] no optimizations, the default for debug.
[-O]     perform optimizations, the default for release.
[-Ofast] perform optimizations and disable runtime overflow checks and runtime type checks.

使用您的代码,我在不同的优化级别上得到了这些时间:

[-onone]

Swift: 6110.98903417587ms
Objc:  134.006023406982ms
Swift: 89.8249745368958ms
Objc:  85.5680108070374ms
Swift: 77.1470069885254ms
Objc:  76.3399600982666ms
 类似资料:
  • 我正在使用Swift中的实现实质上是一个缓存。演出远未达到我的预期。我读过一些其他问题,例如关于数组排序的问题,它似乎暗示是答案(如果您准备接受它带来的更改)。但是,即使在编译时,性能也比其他语言差。我使用的是Swift 1.0版(Swift-600.0.34.4.8)。 下面是一个简单的例子来说明这个问题: 使用编译时,运行时间超过两秒: 相比之下,这个Java实现: 又快了6倍: 难道仅仅是复

  • 问题内容: 我正在学习快速,并试图理解字典。我已经习惯了PHP,您可能会在其中编写以下内容… 在此示例中,将按以下顺序输出值:1、2、3 我的快速代码看起来像这样… 但是,值以意外的顺序出现。我可以做些干净的事情来保持值的创建顺序,还是不能对字典进行快速排序? 问题答案: 正如已经回答的那样,词典的要点是未排序。Swift(和Objective-C)中有三种类型的集合 数组是项目的有序列表。当项目

  • 问题内容: 我在A * B等Plist中存储了多个公式。我试图弄清楚如何将当前以字符串形式存储在Plist中的此公式用作实际计算公式。我尝试过将公式制作为\(A)* \(B),然后在尝试使用公式之前设置A和B的方法,但这没有用。有什么建议? 例 实际打印出“ \(A)* \(B)” 问题答案: Xcode 8.3.1•Swift 3.1

  • 问题内容: 我一直在尝试实现单例,以用作我从网络上传到我的iOS应用的照片的缓存。我在下面的代码中附加了三个变体。我试图使版本2正常工作,但是它导致了我不理解的编译器错误,并希望就我做错的事情寻求帮助。变体1进行缓存,但我不喜欢使用全局变量。变体3并没有进行实际的缓存,我相信这是因为我在赋给var ic = ....的赋值中获得了副本,对吗? 任何反馈和见解将不胜感激。 谢谢Zvi 问题答案: 标

  • 问题内容: 要找到第一个,请使用: 我如何找到第二次出现? 问题答案: 项目清单 您可以按照以下步骤在剩余的数组切片中再次搜索元素的索引: 编辑/更新: Xcode 11•Swift 5.1或更高版本 测试:

  • 问题内容: 什么之间的区别,以及何时该使用的呢? 例如,在Python中,如果我想打印字典,我只是,但是现在有2个其他选项。我应该如何以及何时使用它们? 问题答案: 一些区别: vs : 调试应用程序时,该功能在Xcode控制台中打印消息。 这是Swift 2中已删除且不再使用的变体。如果看到正在使用的旧代码,则可以安全地将其替换为。 回到Swift 1.x,没有在打印字符串的末尾添加换行符,而是