在我开始一个项目之前,我编写了一个简单的测试来比较来自(System.Collections.Concurrent)的ConcurrentBag相对于锁定和列表的性能.我非常惊讶ConcurrentBag比使用简单的List锁定慢10倍.据我所知,当读写器是同一个线程时,ConcurrentBag效果最好.但是,我没想到它的性能会比传统的锁更糟糕.
我已经运行了一个测试,其中有两个Parallel for循环写入和读取列表/包.然而,写入本身显示了巨大的差异:
private static void ConcurrentBagTest()
{
int collSize = 10000000;
Stopwatch stopWatch = new Stopwatch();
ConcurrentBag<int> bag1 = new ConcurrentBag<int>();
stopWatch.Start();
Parallel.For(0, collSize, delegate(int i)
{
bag1.Add(i);
});
stopWatch.Stop();
Console.WriteLine("Elapsed Time = {0}",
stopWatch.Elapsed.TotalSeconds);
}
Run Code Online (Sandbox Code Playgroud)
在我的盒子上,这需要3-4秒才能运行,相比之下这段代码的0.5-0.9秒:
private static void LockCollTest()
{
int collSize = 10000000;
object list1_lock=new object();
List<int> lst1 = new List<int>(collSize);
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
Parallel.For(0, collSize, delegate(int i)
{
lock(list1_lock)
{
lst1.Add(i);
}
});
stopWatch.Stop();
Console.WriteLine("Elapsed = {0}",
stopWatch.Elapsed.TotalSeconds);
}
Run Code Online (Sandbox Code Playgroud)
正如我所提到的,进行并发读写并不能帮助并发包测试.我做错了什么还是这个数据结构真的很慢?
[编辑] - …
根据我对apply的理解,它解压缩列表并将元素转换为函数的参数.
我看到(apply + [1 2 3])按预期工作,即:它相当于(+ 1 2 3).
为什么(apply或[true false])无效?是不是等同于(或真假)?
我一直在Clojure上玩玩具数据库,想要实现一个B + Tree.当我开始考虑它时,我意识到可能没有办法像Clojure中的其他节点那样使用指针/引用.对于像BST或许多其他树结构这样的东西并不重要,因为你需要的只是存储一个Node的孩子.但是我在B +树中做什么,我需要能够引用Node的兄弟?
在寻找解决方案时,我在Google网上论坛中发布了一篇关于如何在Clojure中实现双向链接列表的帖子,因为在Clojure中还有其他方法可以做.
我怎么办B +树呢?
Angular 的变更检测实现我还是比较习惯的,不清楚在模板中调用函数是否会导致性能问题。
例如,执行以下操作是否更糟:
<mat-tab-group>
<mat-tab label="First"> {{ getFirstTab() }} </mat-tab>
<mat-tab label="Second"> {{ getSecondTab() }} </mat-tab>
</mat-tab-group>
Run Code Online (Sandbox Code Playgroud)
比做:
<mat-tab-group>
<mat-tab label="First"> {{ firstTabContent }}</mat-tab>
<mat-tab label="Second"> {{ secondTabContent }}</mat-tab>
</mat-tab-group>
Run Code Online (Sandbox Code Playgroud)
关于什么:
<button *ngIf="shouldShowButton()" .... >
Run Code Online (Sandbox Code Playgroud)