Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >提高F#映射插入性能

提高F#映射插入性能
EN

Stack Overflow用户
提问于 2020-05-08 19:04:28
回答 1查看 217关注 0票数 5

我目前正在做一些关于F#地图和C#字典的测试。我意识到它们在实现方面有很大的不同,但它们确实为各自的语言提供了相同的用途。

我设计了一个简单的测试来检查插入时间,因为F#映射是不可变的,因此它必须为每次插入创建一个全新的映射。我想知道这到底有多成功。

测试如下:

代码语言:javascript
运行
AI代码解释
复制
 //F# 
 module Test = 
    let testMapInsert () = 
        let sw = Stopwatch()
        let rec fillMap endIdx curr map =
            if curr = endIdx then 
                map 
            else 
                fillMap endIdx (curr + 1) (map |> Map.add curr curr)
        sw.Start ()
        let q = fillMap 100000000 Map.empty
        sw.Stop ()
        printfn "%A" sw.ElapsedMilliseconds

 //C#
 class Program
    {
        static void Test(int x) {
            var d = new Dictionary<int,int>();
            for (int i = 0; i < x; i++) {
                d.Add(i,i);
            }
        }
        static void Main(string[] args) {
            Stopwatch sw = new Stopwatch();
            sw.Start();
            Test(10000000);
            sw.Stop();
            System.Console.WriteLine(sw.ElapsedMilliseconds);
            //FSHARP.Test.testMapInsert(); f# function called in c#.

        }
    }

执行1000万次元素插入会产生以下时间(以毫秒为单位):

代码语言:javascript
运行
AI代码解释
复制
C#: 332

F#: 13605

我认为C#字典会更快一些,但这是非常不同的。

对于这种用例,有没有一种方法可以加速F#字典?或者,这只是一种方式,F#映射在这些情况下与线程安全的性能进行了权衡?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-08 21:01:35

正如评论中提到的,区别不是基于C#和F#之间的区别,而是基于不可变的基于树的映射和基于哈希表的可变字典之间的区别。

使用#time,我在F# interactive中获得了以下性能:

代码语言:javascript
运行
AI代码解释
复制
#time 
// Immutable tree-based F# map (~14 sec)
let mutable map = Map.empty
for i in 0 .. 10000000 do
  map <- Map.add i i map

// Mutable hashtable-based .NET dictionary (~0.3 sec)
let dict = System.Collections.Generic.Dictionary<_, _>()
for i in 0 .. 10000000 do
  dict.Add(i, i)

有趣的问题是-你能让不可变的F#映射变得更快吗?原则上,如果您知道正在使用已排序的数组,则可以更快地构建映射。F#映射没有任何允许您执行此操作的操作,但可以添加它。

当我定义自己的映射类型,它与F#映射共享内部结构时:

代码语言:javascript
运行
AI代码解释
复制
type MapTree<'Key, 'Value when 'Key : comparison > = 
  | MapEmpty 
  | MapOne of 'Key * 'Value
  | MapNode of 'Key * 'Value * MapTree<'Key, 'Value> *  MapTree<'Key, 'Value> * int

然后我可以定义ofSortedArray操作:

代码语言:javascript
运行
AI代码解释
复制
let height = function
  | MapEmpty -> 0
  | MapOne _ -> 1
  | MapNode(_, _, _, _, h) -> h

let rec ofSortedArray (data:_[]) i j = 
  if i = j then MapOne(data.[i])
  elif i > j then MapEmpty 
  else 
    let m = i + (j - i) / 2
    let l, r = ofSortedArray data i (m - 1), ofSortedArray data (m + 1) j
    let k, v = data.[m]
    MapNode(k, v, l, r, 1 + (max (height l) (height r)))

这仍然比不上可变哈希表的效率,但我得到了以下结论:

代码语言:javascript
运行
AI代码解释
复制
// Immutable tree-based F# map, using sorted array 
let arr = [| for i in 0 .. 10000000 -> i, i |] // ~1 sec
let map = ofSortedArray arr 0 10000000         // ~3 sec

如果你真的想使用它,你需要你自己的F#地图版本--或者你可以向F#核心库发送一个拉取请求,添加对这类东西的支持!

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61686286

复制
相关文章
YouTube API
YouTube API 能够让你搜索 YouTube 上的视频并且把它们显示在你的站点上。而且可以让你通过 API 上传视频。
Denis
2023/04/13
1.7K0
PHP-自动加载类
在项目开发中,因为一个文件中只能写一个类,并且在执行过程中会有很多的类参与,如果一个一个的加载很麻烦,所以,就需要一个机制实现在PHP执行过程中自动加载需要的类。
cwl_java
2022/11/30
8340
PHP-自动加载类
php-自动加载类
PHP 提供了若干方式来自动加载包含还未加载的类的文件。 老的方法是使用名为 autoload() 魔术全局函数。 然而你一次仅能定义一个 autoload() 函数,因此如果你的程序包含一个也使用了 __autoload() 函数的库,就会发生冲突。 处理这个问题的正确方法是唯一地命名你的自动加载函数,然后使用 spl_autoload_register() 函数来注册它。 该函数允许定义多个 autoload() 这样的函数,因此你不必担心其他代码的 autoload() 函数。 test.php的内容
kdyonly
2023/03/03
8410
java提示找不到或无法加载主类
背景 默许jdk的配置大家都没有问题,执行java,javac无报错,但今天在尝试在本地起来kafka的时候,提示java 找不到或无法加载主类,然后日志中提示 Files 找不到或无法加载主类;C:
千往
2018/01/24
1.9K0
java提示找不到或无法加载主类
错误: 找不到或无法加载主类(java)
很多刚学java的同学基本上都遇到过这个问题,刚才我刚了一下idea中入口雷类的包的地址,就出现这个了。原因很简单,在此特做记录,希望能帮助到点开这个文章,遇到错误的你。
手撕代码八百里
2020/07/28
5.2K0
Instant Run 导致动态加载找不到类问题
今天遇到一个诡异的问题,之前在4.4.4手机上正常运行的动态加载在6.0.1上居然报找不到类,记录一下定位过程。
用户2930595
2018/08/23
8780
Instant Run 导致动态加载找不到类问题
idea 错误:找不到或无法加载主类 解决
问题出现的很莫名其妙,, 在项目的PATH 中,将path修改为跟当前项目在一个路径下就可以了
MickyInvQ
2020/09/27
12.7K0
idea 错误:找不到或无法加载主类 解决
IDEA 出现错误:找不到或无法加载主类
解决方法: idea本身缓存问题 解决:清理缓存重启IDEA file-->invalidate Cache/restart 解决方法二: 在这里设置自己的java文件的目录位置
孙晨c
2019/09/10
6.8K1
IDEA 出现错误:找不到或无法加载主类
PHP的类自动加载机制
在PHP开发过程中,如果希望从外部引入一个class,通常会使用include和require方法,去把定义这个class的文件包含进来。这个在小规模开发的时候,没什么大问题。但在大型的开发项目中,这么做会产生大量的require或者include方法调用,这样不因降低效率,而且使得代码难以维护,况且require_once的代价很大。
黄规速
2022/04/14
8300
Java提示错误: 找不到或无法加载主类
检查java在Idea终端中是否可用,如不可用,编辑编译器输出路径:文件→项目结构→模块→路径→输出目录 或 设置→工具→终端→项目设置→环境变量
无刺鱼
2022/03/29
2.2K0
PHP中类的自动加载
在之前,我们已经学习过Composer自动加载的原理,其实就是利用了PHP中的类自动加载的特性。在文末有该系列文章的链接。
硬核项目经理
2020/03/12
1.3K0
java找不到或无法加载主类_java找不到或无法加载主类如何解决?解决方法「建议收藏」
大家好,又见面了,我是你们的朋友全栈君。 相信有很多人都遇到过java找不到或无法加载主类的这个问题,那么这究竟是什么原因造成的呢?有什么方法可以解决这个问题吗? 问题: java文件导入到一个包
全栈程序员站长
2022/11/17
2.9K0
java找不到或无法加载主类_java找不到或无法加载主类如何解决?解决方法「建议收藏」
rocketmq broker启动报错,找不到或无法加载主类
版本:4.7.0 原因:JAVAHOME环境变量路径中包含空格 解决方案:修改runbroker.cmd 改为 set "JAVA_OPT=%JAVA_OPT% -cp "%CLASSPATH%"
路过君
2020/08/12
3.8K0
rocketmq broker启动报错,找不到或无法加载主类
PHP的yaf框架类加载机制
这里的local_library指的是application.ini文件中设置的application.library 的值
anakinsun
2019/06/16
1K0
IDEA——错误: 找不到或无法加载主类 com.Main
昨天在使用IDEA创建了一个普通Java项目,执行main()方法时,程序报错如下:  “错误: 找不到或无法加载主类 com.Main Process finished with exit code 1”,  我确信自己的java jdk安装和环境变量配置(java jdk安装和环境变量配置)正确无误,而程序只是一个再简单不过的打印而已:
业余草
2019/03/16
54K0
Spring Boot 调试日志(一) 找不到或无法加载主类
在IDEA通过右键运行没有问题,但是把Spring Boot程序打包成jar包用cmd运行时间会出现“找不到或无法加载主类错误"
Kindear
2020/01/15
3K0
Spring Boot 调试日志(一) 找不到或无法加载主类
PHP 命名空间与类自动加载实现
在 PHP 5.3 之前,要在一个 PHP 脚本中引入另一个 PHP 脚本中定义的代码(通常是函数或者类),需要借助 include、require、include_once、require_once 等语句,include 和 require 都可以通过指定路径引入一个 PHP 脚本,区别是 include 没有找到对应路径脚本时发出警告(E_WARNING),而 require 会抛出致命错误(E_COMPILE_ERROR),include_once/require_once 也是用于引入指定路径 PHP 脚本,与 include/require 的区别是如果指定路径已经包含过,不会再次包含,换言之,只会包含一次同一路径脚本,include_once 和 require_once 的区别与 include/require 一样。
学院君
2020/08/18
1K0
PHP 命名空间与类自动加载实现
PHP命名空间与自动加载类详解
spl_autoload_register() 满足了此类需求。 它实际上创建了 autoload 函数的队列,按定义时的顺序逐个执行。相比之下, __autoload() 只可以定义一次。
用户2323866
2021/07/13
7630
eclipse中运行wordcount时显示找不到map和reduce类
eclipse中运行hadoop中wordcount任务时显示:找不到map和reduce类,并且有很多失败的task。 程序配置的问题,如果是spring hadoop程序,则是hadoop.properties配置文件的问题,其配置问题如下: wordcount.input.path=hdfs://192.168.0.118:9000/user/hadoop/file wordcount.output.path=hdfs://192.168.0.118:9000/user/hadoop/fileout5
闵开慧
2018/03/30
1K0
Eclipse 下找不到或无法加载主类的解决办法
有时候 Eclipse 会发神经,好端端的 project 就这么编译不了了,连 Hello World 都会报“找不到或无法加载主类(Exception in thread "main" java.lang.NoClassDefFoundError:xxx)”的错误,我已经遇到好几次了,以前是懒得深究就直接重建project了,但遇到次数多了必须深究下了,现总结几种解决方案,大家根据自己的情况逐一尝试即可。 1、是因为.java文件不在项目的src路径内,也就是说源代码未被eclipse编译,字节码不存在
用户1177713
2018/02/24
11K0
Eclipse 下找不到或无法加载主类的解决办法

相似问题

用于跳过ui代码的jacoco代码覆盖率

11

测试过程中分级跳过JaCoCo

29

JaCoCo测试覆盖率问题maven构建失败

129

如何使用JaCoCo代理检查代码覆盖率?

11

Jacoco代码覆盖率

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档