[英]Is it possible to get a stream for an assembly generated in memory using CodeDOM?
在我的一些測試中,我需要生成一些程序集,然后使用ICSharpCode.Decompiler “反編譯”它們,它使用Mono.Cecil來檢查程序集。
出於性能原因,我想在內存中生成程序集以避免磁盤I / O.
你可以找到一些我打算使用的代碼:
var cdp = CodeDomProvider.CreateProvider(CodeDomProvider.GetLanguageFromExtension("cs"));
var p = new CompilerParameters { GenerateInMemory = true } ;
var cr = cdp.CompileAssemblyFromSource(p, sources);
if (cr.Errors.Count > 0)
{
throw new Exception(cr.Errors[0].ErrorText);
}
// !!! I'd like to avoid building / loading the assembly to / from disk
// var assembly = AssemblyDefinition.ReadAssembly(assemblyPath, readerParameters);
// Instead, I'd like to do something like:
Stream assemblyStream = GetAssemblyContentAsStream(cr.CompiledAssembly);
var assembly = AssemblyDefinition.ReadAssembly(assemblyStream, readerParameters);
var dc = new DecompilerContext(assembly.MainModule);
var astBuilder = new AstBuilder(dc);
astBuilder.AddType(typeToBeConverted);
var output = new StringWriter();
astBuilder.GenerateCode(new PlainTextOutput(output));
所以問題是:是否可以實現GetAssemblyContentAsStream()?
出於性能原因,我想在內存中生成程序集以避免磁盤I / O.
這是編程的偉大神話之一。 現代操作系統太聰明,不足以使磁盤I / O成為瓶頸。 您的程序實際上並不將程序集寫入磁盤,而是將其寫入文件系統緩存。 內存。 寫入磁盤稍后會發生在后台運行的內核線程中,並且對perf沒有影響。
非常相似,將“記憶”視為RAM也是一個神話。 程序分配虛擬內存 。 它根本不是內存,它是在頁面文件中分配的空間。 在磁盤上。 操作系統的工作是在程序需要時為該程序提供該空間。 將頁面文件分配映射到RAM。 寫入磁盤的時間稍晚,發生在另一個進程需要RAM時運行的內核線程中。
看到相似度? 沒有區別 。 您可以觀察到的唯一可能的副作用是當您在具有非常有限的RAM的計算機上運行時。 當文件系統緩存中沒有足夠的可用空間時,程序必須等到數據寫入文件。 這樣的機器也很難使RAM可用於您的程序。 它需要丟棄其他進程(或您自己的)使用的RAM頁面,將它們寫入磁盤。 換句話說,您的程序開始很慢而不是很慢完成工作。 凈差異接近於零。
程序集的大小決不會對現代計算機上文件系統緩存可用的RAM量造成壓力。 一個簡單的千兆字節至少。 所以,不要打擾,你永遠不會真正看到性能提升。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.