当前位置: 首页 > 面试题库 >

如何在Scala中优化理解和循环?

柯清野
2023-03-14
问题内容

因此,Scala应该和Java一样快。我正在重新研究最初在Java中解决的Scala
Project
Euler
问题。特别是问题5:“能被从1到20的所有数字均分的最小正数是多少?”

这是我的Java解决方案,需要0.7秒才能在计算机上完成:

public class P005_evenly_divisible implements Runnable{
    final int t = 20;

    public void run() {
        int i = 10;
        while(!isEvenlyDivisible(i, t)){
            i += 2;
        }
        System.out.println(i);
    }

    boolean isEvenlyDivisible(int a, int b){
        for (int i = 2; i <= b; i++) {
            if (a % i != 0) 
                return false;
        }
        return true;
    }

    public static void main(String[] args) {
        new P005_evenly_divisible().run();
    }
}

这是我对Scala的“直接翻译”,需要103秒(长147倍!)

object P005_JavaStyle {
    val t:Int = 20;
    def run {
        var i = 10
        while(!isEvenlyDivisible(i,t))
            i += 2
        println(i)
    }
    def isEvenlyDivisible(a:Int, b:Int):Boolean = {
        for (i <- 2 to b)
            if (a % i != 0)
                return false
        return true
    }
    def main(args : Array[String]) {
        run
    }
}

最后,这是我进行函数式编程的尝试,该过程需要39秒(长55倍)

object P005 extends App{
    def isDivis(x:Int) = (1 to 20) forall {x % _ == 0}
    def find(n:Int):Int = if (isDivis(n)) n else find (n+2)
    println (find (2))
}

在Windows 7 64位上使用Scala 2.9.0.1。如何改善效能?难道我做错了什么?还是Java快了很多?


问题答案:

在这种情况下,问题是您从for表达式中返回。依次将其转换为抛出NonLocalReturnException的异常,该异常在封装方法中捕获。优化器可以消除前馈,但不能消除抛出/捕获。而且投掷/接球很昂贵。但是由于这样的嵌套返回在Scala程序中很少见,因此优化器尚未解决这种情况。有一些工作正在进行中,以改进优化程序,希望可以尽快解决此问题。



 类似资料:
  • 有时候你会遇到循环,或者递归函数,它们会花费很长的执行时间,可能是你的产品的瓶颈。在你尝试使循环变得快一点之前,花几分钟考虑是否有可能把它整个移除掉,有没有一个不同的算法?你可以在计算时做一些其他的事情吗?如果你不能找到一个方法去绕开它,你可以优化这个循环了。这是很简单的,move stuff out。最后,这不仅需要智慧而且需要理解每一种语句和表达式的开销。这里是一些建议: 删除浮点运算操作。

  • 我试图创建一个简洁的结构,用于理解基于未来的业务逻辑。下面是一个示例,其中包含一个基于异常处理的工作示例: 然而,这可能被视为一种非功能性或非Scala的处理方式。有更好的方法吗? 请注意,这些错误来自不同的来源——有些在业务级别(“检查所有权”),有些在控制器级别(“授权”),有些在数据库级别(“找不到实体”)。因此,从单一常见错误类型派生它们的方法可能不起作用。

  • 问题内容: 我已经在python中编写了一个函数来计算高斯扩展中的Delta函数,该函数涉及4级循环。但是,效率非常低,以类似方式比使用Fortran慢约10倍。 我删除了一些常量以使其看起来更简单。 有谁能帮助我优化此脚本以提高效率? 问题答案: 只需编译 为了获得最佳性能,我建议使用Numba(易于使用,性能良好)。另外,Cython可能是一个好主意,但是对您的代码进行了更多更改。 实际上,您

  • 问题内容: 我想要的只是使用一些并发Set(看起来根本不存在)。Java用于实现该行为。我想在Scala中做类似的事情,所以我创建了Scala HashMap(或Java ConcurrentHashMap)实例,并尝试添加一些元组: 当然,由于Unit是抽象的也是最终的,因此这使编译过程崩溃了。 如何使这项工作?我应该使用/ 代替吗?我必须确保没有人插入任何值。 感谢帮助 问题答案: 您可以只使

  • 我想优化下面的代码。streams会优化下面嵌套的foreach循环吗?如果是这样的话,我是streams的新手,有人能帮我吗?出于项目保密的目的,我在下文中替换了这些名称。应使用tList进行代码中的进一步处理。有人能帮忙吗?

  • 您好,我当前正在尝试将从XML文件获取的数据插入到我的MySql数据库中。我使用sails.js和waterline进行查询。我的表是用户和宠物,一个用户可以有多个宠物,一个宠物可以有多个用户(所有者),所以我的联接表是users_pets。 -我将XML文件转换为javascript对象,并循环使用它来插入数据。我的问题是我需要循环是异步的,因为我不希望在pets表中有重复的记录。对于每次迭代,