我已经阅读了几篇关于编写和编译动态C#代码的帖子.例如,这篇文章.我知道它可以通过几种方式完成.
但是,调用代码调用程序很慢.我做了一个简单的基准测试,它比调用本机方法慢了约500倍.
我希望能够做的是等同于加载DLL并直接调用其中一个方法("本机"),这将提供我想要的速度优势.
最简单的方法是什么?将动态代码编译为dll然后加载它?可以在记忆中完成吗?
编辑
我不关心编译时间.只执行.
编辑2,3
这是我写的基准代码:
public static int Execute(int i) { return i * 2; }
private void button30_Click(object sender, EventArgs e)
{
CSharpCodeProvider foo = new CSharpCodeProvider();
var res = foo.CompileAssemblyFromSource(
new System.CodeDom.Compiler.CompilerParameters()
{
GenerateInMemory = true,
CompilerOptions = @"/optimize",
},
@"public class FooClass { public static int Execute(int i) { return i * 2; }}"
);
var type = res.CompiledAssembly.GetType("FooClass");
var obj = Activator.CreateInstance(type);
var method = type.GetMethod("Execute");
int i = 0, t1 …Run Code Online (Sandbox Code Playgroud) I wrote a multi-threaded app to benchmark the speed of running LOCK CMPXCHG (x86 ASM).
On my machine (dual Core - Core 2), with 2 threads running and accessing the same variable, I can perform about 40M ops/second.
Then I gave each thread a unique variable to operate on. Obviously this means there's no locking contention between the threads, so I expected a speed performance. However, the speed didn't change. Why?
我是MongoDB的新手,所以请耐心等待.
我有两个问题:
首先,请采取以下措施:
// add a record
$obj = array( "title" => "Calvin and Hobbes", "author" => "Bill Watterson" );
Run Code Online (Sandbox Code Playgroud)
MongoDB是否将"title"和"author"存储为此集合中此对象的每个条目的文本?或者它是否创建了一个模式并将它们转换为字段数(或者根本没有存储并纯粹存储数据)?
我的第二个问题是:什么时候应该使用"关系"?假设我有100个经销商,每个经销商包含(对象)1,000个客户,每个客户有10个项目.这使得一个巨大的整体对象可以操纵.
在SQL世界中,这都是相关的"对象".在Document world中,我们尝试通过嵌入子对象来存储完整的对象.
但是,这可能很笨拙.这是什么最好的做法?有人可以指点我的指南.
谢谢.
这是一个好奇心问题.我正在看这个代码反汇编(C#,64位,发布模式,VS 2012 RC):
double a = 10d * Math.Log(20d, 2d);
000000c8 movsd xmm1,mmword ptr [00000138h]
000000d0 movsd xmm0,mmword ptr [00000140h]
000000d8 call 000000005EDC7F50
000000dd movsd mmword ptr [rsp+58h],xmm0
000000e3 movsd xmm0,mmword ptr [rsp+58h]
000000e9 mulsd xmm0,mmword ptr [00000148h]
000000f1 movsd mmword ptr [rsp+30h],xmm0
a = Math.Pow(a, 6d);
000000f7 movsd xmm1,mmword ptr [00000150h]
000000ff movsd xmm0,mmword ptr [rsp+30h]
00000105 call 000000005F758220
0000010a movsd mmword ptr [rsp+60h],xmm0
00000110 movsd xmm0,mmword ptr [rsp+60h]
00000116 movsd mmword ptr [rsp+30h],xmm0
Run Code Online (Sandbox Code Playgroud)
...并且发现奇怪的是编译器没有在此处使用x87指令(Power使用日志).当然,我不知道调用位置的代码是什么,但我知道SIMD没有Log功能,这使得这个选择更加奇怪.此外,这里什么都没有,所以为什么SIMD而不是简单的x87?
在较小的一点上,我还发现奇怪的是没有使用x87 FYL2X指令,这是专门针对第一行代码中所示的情况而设计的.
任何人都可以对此有所了解吗?
编辑
@Remus纠正了我的测试模式.您可以在下面的答案中看到更正后的版本.
我接受了用DECIMAL(29,0)替换INT的建议,结果如下:
十进制:2133
GUID:1836
随机插入仍然会赢,即使行数稍大一些.
尽管解释表明随机插入比连续插入慢,但这些基准测试表明它们显然更快.我得到的解释不符合基准.因此,我的问题仍然集中在b树,顺序插入和速度上.
...
我从经验中知道,当数据按顺序添加到它们时(无论方向如何),b树的性能都很糟糕.但是,当随机添加数据时,可以获得最佳性能.
这很容易用RB-Tree来演示.顺序写入会导致执行最大数量的树余额.
我知道很少有数据库使用二叉树,而是使用n阶平衡树.我逻辑上假设它们在顺序输入时遇到与二叉树类似的命运.
这引起了我的好奇心.
如果是这样,则可以推断出写入顺序ID(例如在IDENTITY(1,1)中)会导致树的多次重新平衡发生.我看过许多帖子反对GUID,因为"这些会导致随机写入".我从不使用GUID,但令我印象深刻的是,这个"坏"点实际上是一个好点.
所以我决定测试它.这是我的代码:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[T1](
[ID] [int] NOT NULL
CONSTRAINT [T1_1] PRIMARY KEY CLUSTERED ([ID] ASC)
)
GO
CREATE TABLE [dbo].[T2](
[ID] [uniqueidentifier] NOT NULL
CONSTRAINT [T2_1] PRIMARY KEY CLUSTERED ([ID] ASC)
)
GO
declare @i int, @t1 datetime, @t2 datetime, @t3 datetime, @c char(300)
set @t1 = GETDATE()
set @i = 1
while @i < …Run Code Online (Sandbox Code Playgroud) 我想创建一个通用的List <>,其类型在运行时声明.
我可以做到以下几点,但由于它是动态的,我怀疑存在速度惩罚.我正在为异国情调的数据库编写一个包装器,因此速度至关重要.
List<dynamic> gdb = new List<dynamic>()
Run Code Online (Sandbox Code Playgroud)
我在动态泛型类型中阅读了这篇文章,但无法让它发挥作用.具体来说,该对象不会显示为List,因此没有添加方法.
Type ac;
switch (trail[dataPos].Type)
{
case GlobalsSubscriptTypes.Int32:
ac = typeof(System.Int32);
break;
case GlobalsSubscriptTypes.Int64:
ac = typeof(System.Int64);
break;
default:
ac = typeof(System.String);
break;
}
var genericListType = typeof(List<>);
var specificListType = genericListType.MakeGenericType(ac);
var gdb = Activator.CreateInstance(specificListType);
Run Code Online (Sandbox Code Playgroud)
如何让gdb显示为以下之一:
List<System.Int32>
List<System.Int64>
List<System.String>
Run Code Online (Sandbox Code Playgroud) 我有这样的数据:
Akhoond,1,Akhoond,"{""Akhund"",""Akhwan""}",0
pgAdmin的导入拒绝了.文本[]需要采用什么格式在CSV中?
我也试过这个:
Akhoond,1,Akhoond,"{Akhund,Akhwan}",0
这是表创建:
CREATE TABLE private."Titles"
(
"Abbrev" text NOT NULL,
"LangID" smallint NOT NULL REFERENCES private."Languages" ("LangID"),
"Full" text NOT NULL,
"Alt" text[],
"Affix" bit
)
WITH (
OIDS=FALSE
);
ALTER TABLE private."Titles" ADD PRIMARY KEY ("Abbrev", "LangID");
CREATE INDEX ix_titles_alt ON private."Titles" USING GIN ("Alt");
ALTER TABLE private."Titles"
OWNER TO postgres;
Run Code Online (Sandbox Code Playgroud) 我有一个循环将两个float*数组加载到__m256向量中并处理它们。在这个循环之后,我有代码将平衡值加载到向量中,然后处理它们。所以函数上没有对齐要求。
以下是将数据余额加载到向量中的代码:
size_t constexpr FLOATS_IN_M128 = sizeof(__m128) / sizeof(float);
size_t constexpr FLOATS_IN_M256 = FLOATS_IN_M128 * 2;
Run Code Online (Sandbox Code Playgroud)
...
assert(bal < FLOATS_IN_M256);
float ary[FLOATS_IN_M256 * 2];
auto v256f_q = _mm256_setzero_ps();
_mm256_storeu_ps(ary, v256f_q);
_mm256_storeu_ps(&ary[FLOATS_IN_M256], v256f_q);
float *dest = ary;
size_t offset{};
while (bal--)
{
dest[offset] = p_q_n[pos];
dest[offset + FLOATS_IN_M256] = p_val_n[pos];
offset++;
pos++;
}
// the two vectors that will be processed
v256f_q = _mm256_loadu_ps(ary);
v256f_val = _mm256_loadu_ps(&ary[FLOATS_IN_M256]);
Run Code Online (Sandbox Code Playgroud)
assert(bal < FLOATS_IN_M256);当我使用编译器资源管理器时,设置为“x86-64 clang 16.0.0 -march=x86-64-v3 -O3”,编译器会在该行存在时展开循环。但是,assert()在模式中被忽略 …
假设一个表包含足够的信息以保证索引搜索,SQL Server(或PostgreSQL)选择索引扫描的基数是什么?
我问这个的原因是我之前发布了一个问题(链接),其中两个查询以相同的速度执行,但是一个没有尝试在已处理的列上使用索引.在SQL Server建议我放置一个覆盖索引,其中包括要查询的列(它为两个查询建议这个),我开始寻找原因,为什么它会提出这样一个奇怪的建议.
我尝试使索引覆盖和复合,但两者都在同一时间执行(我们说的是300万行).
最后我得出结论是因为数据的超高基数.每一行都是独特的.我推断这导致SQL服务器选择索引扫描.但是,查询声明"WHERE Col1>?AND Col2 <?",所以这有点令人困惑.
我的问题是:
我附上了执行计划.

我想要了解Cassandra的复合色谱柱存储引擎.不幸的是,到目前为止我读过的文档包含错误,让我有点空白.
首先,术语.
复合列通过使用复合主键包含完全非规范化的宽行.
这似乎具有误导性,因为AFAIK复合列可以用于复合键,也可以简单地用作除键之外的复合列.
1:如何实现复合键和列名?我能找到的每个CQL示例只显示复合键作为列,而不是普通复合列.
假设我们将列'a','b','c','d'作为主要复合键+列'e','f'.我知道'a'将是行和分区键.
我们假设以下数据:
a b c d e f
1a 1b 1c 1d e1 f1
1a 1b 1c 2d e1 f2
1a 1b 1c 2d e2 f3
2a 2b 2c 2d e2 f4
Run Code Online (Sandbox Code Playgroud)
2:这是如何存放在引擎盖下的?我想这里真正的问题是'b','c','d'如何映射出来,因为列根据定义不是分层的.
3:我读过的文档说不再使用紧凑型存储.但是如果不需要添加非主键列呢...那么不使用它的原因是什么?
assembly ×2
c# ×2
dynamic ×2
indexing ×2
postgresql ×2
simd ×2
sql-server ×2
.net ×1
assemblies ×1
benchmarking ×1
c#-4.0 ×1
c++ ×1
cassandra ×1
clang ×1
csv ×1
disassembly ×1
generics ×1
locking ×1
mongodb ×1
performance ×1
sql ×1
storage ×1
visual-c++ ×1
x86 ×1