七周七语言:Scala Day 3
生活随笔
收集整理的這篇文章主要介紹了
七周七语言:Scala Day 3
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這一天的內容還是比較豐富的,不僅介紹了Scala中的對于XML的處理、正則,更有比較重要的“并發”。
Scala支持并發的方式代表了并行編程領域的一次重大進步。actor模型和線程池都是很受歡迎的改進,并且無需可變狀態的并發應用設計能力也絕對是一個巨大的進步。--摘自《七周七語言》-
對于sizer程序,如果你沒有為每一個要跟蹤的鏈接創建一個新的actor,這段程序的性能會發生怎樣的變化?
感覺會很慢,因為每個actor都包含了react和receive方法,如果沒有對于每個鏈接都創建actor的話,那和sequentially的方法就沒有什么區別了。
-
修改sizer程序,增加一個計算頁面上鏈接總和的消息。
import scala.io._ import scala.actors._ import Actor._ ? object PageLoader { ????def getPageSize(url: String) = Source.fromURL(url).mkString.length ????// get the contents of the the URL ????def getPageContent(url: String) = Source.fromURL(url).mkString ????// regular expression of a link ????def getUrlNumber(url: String) = { ????????val reg = """^(?i)<a[^>]+?href""".r ??? ????????reg.findAllIn(getPageContent(url)).size ????} } // the List of urls val urls = List("http://www.baidu.com/", ????????????????"http://www.seu.edu.cn/", ????????????????"http://www.fantasyshao.tk/" ???????????????) // Cauculate the time of running def timeMethod(method: ()=> Unit) = { ????val start = System.nanoTime ????method() ????val end = System.nanoTime ????println("Method took " + (end - start)/1000000000.0 + " seconds.") } // not using actors def getPageSizeSequentially() = { ????for(url <- urls) { ????????println("Size for " + url + ": " + PageLoader.getPageSize(url)) ????} ????for(url <- urls) { ????????println("Links in " + url + ": " + PageLoader.getUrlNumber(url)) ????} } // concurrency method def getPageSizeConcurrently() = { ????val caller = self ????for(url <- urls) { ????????actor { caller ! ("Size", url, PageLoader.getPageSize(url))} ????????actor { caller ! ("Number", url, PageLoader.getUrlNumber(url))} ????} ????// two actor for each url, so the size became lager ????for(i <- 1 to (urls.size * 2)) { ????????receive { ????????????case ("Size", url, size) => ????????????????println("Size for " + url + ": " + size) ????????????case ("Number", url, number) => ????????????????println("Number of " + url + ": " + number) ????????} ????} } ? println("Sequential run:") timeMethod { getPageSizeSequentially } ? println("Concurrent run:") timeMethod { getPageSizeConcurrently }
轉載于:https://www.cnblogs.com/iceCream/archive/2013/01/23/2873093.html
總結
以上是生活随笔為你收集整理的七周七语言:Scala Day 3的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ResourceDictionary主题
- 下一篇: FreeSql (十五)查询数据