Microsoft的新F#编程语言提供了功能编程(一流的词法闭包和尾调用)与高效的并发垃圾收集器的强大组合,可以轻松利用多核.
OCaml,Haskell,Erlang以及我所知道的所有免费的Lisp和Scheme实现没有并发GC.Scala和Clojure有一个并发GC但没有尾调用.
因此似乎没有结合这些功能的开源编程语言.那是对的吗?
我只是阅读Brodal等人的Purely Functional Worst Case Constant Time Catenable Sorted Lists.他们在数据结构的背景下对不同类型的持久性的介绍给我一个明显的问题:
汇合持久性:可以更新和查询所有版本,另外,可以组合两个版本以生成新版本.注意,在这种情况下,可以通过重复地将其与自身连接来在多项式时间内创建指数大小的结构.
通过反复加入自身,能够在多项式时间内创建"指数大小"结构的实际应用是什么?
在Konrad Rudolph关于相关问题的评论的提示下,我编写了以下程序来对F#中的正则表达式性能进行基准测试:
open System.Text.RegularExpressions
let str = System.IO.File.ReadAllText "C:\\Users\\Jon\\Documents\\pg10.txt"
let re = System.IO.File.ReadAllText "C:\\Users\\Jon\\Documents\\re.txt"
for _ in 1..3 do
let timer = System.Diagnostics.Stopwatch.StartNew()
let re = Regex(re, RegexOptions.Compiled)
let res = Array.Parallel.init 4 (fun _ -> re.Split str |> Seq.sumBy (fun m -> m.Length))
printfn "%A %fs" res timer.Elapsed.TotalSeconds
Run Code Online (Sandbox Code Playgroud)
以及C++中的等价物:
#include "stdafx.h"
#include <windows.h>
#include <regex>
#include <vector>
#include <string>
#include <fstream>
#include <cstdio>
#include <codecvt>
using namespace std;
wstring load(wstring filename) {
const locale empty_locale = locale::empty(); …Run Code Online (Sandbox Code Playgroud) 可以使用F#中的计算表达式实现CPS吗?
Brian McNamara的博客提供了以下解决方案:
type ContinuationBuilder() =
member this.Return(x) = (fun k -> k x)
member this.ReturnFrom(x) = x
member this.Bind(m,f) = (fun k -> m (fun a -> f a k))
member this.Delay(f) = f()
let cps = ContinuationBuilder()
Run Code Online (Sandbox Code Playgroud)
看起来不错。我可以用List.mapCPS 编写:
let rec mapk f xs = cps {
match xs with
| [] -> return []
| x::xs ->
let! xs = mapk f xs
return f x::xs
}
Run Code Online (Sandbox Code Playgroud)
但是它会溢出:
mapk ((+) 1) [1..1000000] id
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
F# 提供反射,让您可以在运行时生成函数、元组、记录和联合类型的新值。但是,我在该模块中看不到与匿名记录有关的任何内容。
是否可以在 F# 运行时创建匿名记录类型的新值?
如果Mono项目成功,它将为非Windows平台上的商业软件铺平道路.
我对使用我们现有的Smoke Vector Graphics(OCaml)和F#for Visualization(.NET)产品编写和销售Mono平台商业软件的前景感兴趣.是否有任何商业图书馆开发人员已经建立在Mono上,如果是这样,他们是否从中获利?
此外,用Microsoft的F#语言编写软件是否可行,或者Mono是否会在使用ILX时遇到问题?
.NET 4包含新的并发数据结构.Bag和Dictionary集合有明显的应用程序,但我看不到Queue和Stack数据结构的任何用途.人们使用这些是为了什么?
另外,我注意到基于链表的设计会产生大量的分配并破坏可扩展性.鉴于这些集合的唯一目的是多核编程,这是令人惊讶的.这是一个固有的限制还是刚刚实施得很糟糕?
我最近开始使用ANTS分析工具进行生产工作.除了惊讶于他们的精彩之外,我不禁想知道他们是如何工作的.例如,最有用的功能之一允许您可视化正在运行的程序的全局根,其中包含对不同类型值的引用数.
该工具如何获取该信息?
共享内存并行编程(特别是多核)中的哪些挑战无法使用Cilk风格的解决方案(即每个核心工作窃取任务deques的嵌套数据并行性)有效解决或无法解决?
我以为我会尝试使用FParsec编写一个快速解析器,并很快意识到many返回列表是一个严重的性能问题.然后我发现了一个ResizeArray在文档中使用a的替代方法:
let manyA2 p1 p =
Inline.Many(firstElementParser = p1,
elementParser = p,
stateFromFirstElement = (fun x0 ->
let ra = ResizeArray<_>()
ra.Add(x0)
ra),
foldState = (fun ra x -> ra.Add(x); ra),
resultFromState = (fun ra -> ra.ToArray()),
resultForEmptySequence = (fun () -> [||]))
let manyA p = manyA2 p p
Run Code Online (Sandbox Code Playgroud)
在我的代码中使用它会使它运行速度快几倍.那么为什么FParsec默认使用列表而不是ResizeArray?
.NET附带了一些内置集合(堆栈,队列,字典,列表等),但缺少其他常见集合,如优先级队列.在NuGet上有很多第三方收集库,但我想知道是否有一个正式的Microsoft(如现在称为BCL不可变集合System.Collections.Immutable)库,其中包含(可变的)优先级队列?
编辑:重要澄清(@rmunn评论):
这个问题并不是要求为X推荐一个库,而是在问一个事实问题,"X是否有官方的Microsoft库?"
f# ×5
.net ×4
c# ×3
concurrency ×2
algorithm ×1
ants ×1
c++ ×1
cilk ×1
collections ×1
fparsec ×1
graphics ×1
mono ×1
performance ×1
persistence ×1
profiling ×1
reflection ×1
regex ×1
tail-call ×1