小编Tao*_*Gil的帖子

如何用F#成语提高性能

我正在使用机器学习课程同时学习F#.我做了以下作业练习,这是第二周的第一次练习:

运行计算机模拟以翻转1,000个虚拟公平硬​​币.每个硬币独立翻转10次.专注于3个硬币如下:c1 是第一个硬币翻转,crand是从1,000中随机选择的硬币,而cmin是具有最小频率的硬币(在领带的情况下选择较早的硬币).

ν1,νrand ,和νmin是为3枚各自硬币获得了10次投掷的头部分.运行实验100,000次以获得ν1,νrand和νmin的完整分布(请注意,c rand和c min将从运行变为运行).

νmin的平均值是多少?

我已经生成了以下代码,它工作正常并给出了正确的答案:

let private rnd = System.Random()
let FlipCoin() = rnd.NextDouble() > 0.5
let FlipCoinNTimes N = List.init N (fun _ -> FlipCoin())
let FlipMCoinsNTimes M N = List.init M (fun _ -> FlipCoinNTimes N)

let ObtainFrequencyOfHeads tosses = 
    let heads = tosses |> List.filter (fun toss -> toss = true)
    float (List.length (heads)) / float (List.length (tosses)) …
Run Code Online (Sandbox Code Playgroud)

performance f#

8
推荐指数
2
解决办法
501
查看次数

.NET Core 应用程序进程内存在对象被释放后不会减少

我在 Windows 中运行的 ASP .NET Core 2.1 应用程序遇到问题,该应用程序增加了内存消耗,直到最终崩溃并需要终止进程.NET Core Host。我怀疑原因可能是每小时在后台运行一次的同步任务,并且我已确认禁用它可以解决问题。

我一直在使用 VisualStudio 2019 诊断工具分析此同步任务,并且发现了一个我不理解的行为:

在此输入图像描述

正如你所看到的,我拍摄了 3 张快照:

  1. 同步方法开始时
  2. 结束同步方法
  3. 稍后,一旦我们存在范围

在快照表中,我看到了一个对我来说似乎合乎逻辑的行为:堆大小在任务 (2) 期间显着增长,并且在退出作用域 (3) 时几乎减小到初始大小 (1)。然而,“进程内存”图表显示了一个不同的故事:内存消耗增加了,但它永远不会下降。我已经在发布模式下启动了应用程序dotnet run,并且在查看进程使用的内存时看到了相同的行为.NET Core Host

我有两个问题:

  1. 为什么堆大小和进程内存之间存在这种差异?他们不应该有密切的关系吗?
  2. 这可能是我的网络应用程序崩溃的原因吗?看起来是这样,但内存消耗的增加应该是暂时的,而不是永久性的,直到崩溃为止。我该如何解决它?

备注:我使用一个简单的 .NET Core 控制台应用程序(2.1 和 2.2)重现了相同的行为,没有依赖项,因此它没有链接到 ASP 部分或任何其他库:

internal class Program
{
    private static void Main()
    {
        new Whatever().AllocateSomeStrings();
        // Snapshot3
        Console.ReadKey();
    }
}

public class Whatever
{
    public void AllocateSomeStrings()
    {
        // Snapshot1
        List<string> numbers = Enumerable.Range(0, 50000).Select(n => n.ToString()).ToList(); …
Run Code Online (Sandbox Code Playgroud)

c# memory-management .net-core asp.net-core-2.1

8
推荐指数
1
解决办法
4496
查看次数

为什么最好使用局部函数而不是仅仅内联代码?

我在这里找到了这个代码:

public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source,
        Func<TSource, TKey> keySelector, IEqualityComparer<TKey>? comparer)
{
    if (source == null) throw new ArgumentNullException(nameof(source));
    if (keySelector == null) throw new ArgumentNullException(nameof(keySelector));
    return _(); IEnumerable<TSource> _()
    {
        var knownKeys = new HashSet<TKey>(comparer);
        foreach (var element in source)
        {
            if (knownKeys.Add(keySelector(element)))
                yield return element;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

起初我不明白这部分return _(); IEnumerable<TSource> _(),但我意识到这是一个在同一行中调用和声明的本地函数。这是在这里完成的。

我的问题是:与简单地内联该代码相比有什么优势吗?

public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source,
        Func<TSource, TKey> keySelector, IEqualityComparer<TKey>? comparer)
{
    if (source == null) …
Run Code Online (Sandbox Code Playgroud)

c# local-functions

8
推荐指数
1
解决办法
495
查看次数

为什么不= =实现调用等于Guid?

我已经在.NET Framework的GUID类型的源代码中看到Equals的实现和==操作符执行非常相似的代码.

为什么==操作符不在firts参数上调用Equals方法?像这样的东西:

public static bool operator ==(Guid a, Guid b)
{ 
    return a.Equals(b);  
}
Run Code Online (Sandbox Code Playgroud)

.net c# equals-operator

7
推荐指数
1
解决办法
1445
查看次数

Azure DevOps 中的 PowerShell 任务中管道变量是否可用?

我有这个 PowerShell 脚本,它读取一些环境变量并输出它们:

Write-Host "name: $(tenantName) version: $(versionRelease) url: $(urlApplication)"
Run Code Online (Sandbox Code Playgroud)

这些变量定义为管道变量,并且也定义在 Azure DevOps 发布管道的变量组中。

当在定义为Inline 的PowerShell 任务中运行时,此脚本按预期工作。但是,当使用File Path配置 PowerShell 任务时,相同的脚本将无法工作。在这种情况下,找不到 env 变量:tenantName

tenantName : The term 'tenantName' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
Run Code Online (Sandbox Code Playgroud)

有没有办法使环境变量可用于“文件”脚本,就像“内联”脚本一样?

powershell environment-variables azure-devops

7
推荐指数
1
解决办法
4893
查看次数

使用列表中最后一个元素的"For Each"语句到第一个元素

当我想从列表中的最后一个元素迭代到第一个元素时,我通常会这样做:

For i=list.Count-1 to 0 Step -1
    'do something
Next
Run Code Online (Sandbox Code Playgroud)

我想知道是否有办法使用For Each语句以这种方式迭代列表.

谢谢!

vb.net foreach for-loop

4
推荐指数
1
解决办法
1422
查看次数

获取F#中两个整数列表之间的匹配数

我有两个整数列表(这里是1和0,但可以是任何整数):

List1 : [1; 1; 1; 1]
List2 : [0; 0; 1; 0]
Run Code Online (Sandbox Code Playgroud)

我想计算两个列表之间的值和位置的匹配数.因此,在这种情况下,在第3个位置只有一个匹配.

在C#中,我会使用for循环来解决这个问题,如下所示:

int matches = 0;
for (int i = 0; i < list1.Count; i++)
{
    if (list1[i] == list2[i])
        matches++;
}
Run Code Online (Sandbox Code Playgroud)

但我想知道在F#中是否有更好的方法.

f# list c#-to-f#

3
推荐指数
1
解决办法
87
查看次数

函数式编程与OOP的方法实现实现

我开始通过精彩的网站https://fsharpforfunandprofit.com学习F#

在阅读关于将F#与标准命令式语言区分开来的四个关键概念的条目中的模式匹配时,我发现了这句话(强调我的):

这些类型的选择类型可以通过使用子类或接口在C#中进行一些模拟,但是在C# 类型系统中没有内置支持来进行这种与错误检查的详尽匹配.

这对我来说似乎很奇怪,因为我认为我们可以在C#中的接口(或抽象类中的抽象方法)中使用方法定义获得完全等效的结果:它强制执行所有继承类来实现该方法,与F#代码一样,它强制使用draw方法为所有"继承"类型提供实现.

不同的是,在功能情况下,所有的实现都是相同的方法,而在面向对象的情况下,每个执行被封装在同级别......但在概念上你在这两种情况下相同的执法,所以我不知道看到功能方法的任何好处.

我错过了什么吗?有人可以为我澄清一下吗?

oop f# functional-programming pattern-matching

3
推荐指数
1
解决办法
88
查看次数

为什么ASP.NET Core不强制启动类型来实现接口

ASP.NET Core配置依赖于Startup应具有一个类Configure方法和可任选地包括一个ConfigureServices方法.

我想知道为什么不强制这个类实现包含这两种方法的接口来获得强类型的所有好处.

我知道真正的原因在于框架设计者的想法无法实现,但任何人都可以给出他们为什么选择不使用界面的充分理由吗?

asp.net-core

1
推荐指数
1
解决办法
106
查看次数