在今天早上运行基准测试时,我和我的同事发现了一些关于C#代码与VB.NET代码性能的奇怪之处.
我们开始比较C#与Delphi Prism计算质数,发现Prism的速度提高了约30%.在生成IL时,我认为CodeGear优化代码更多(exe大约是C#的两倍,并且有各种不同的IL.)
我决定在VB.NET中编写一个测试,假设微软的编译器最终会为每种语言编写基本相同的IL.然而,结果更令人震惊:C#的代码运行速度比VB运行速度快三倍以上!
生成的IL是不同的,但并非极端如此,而且我不太善于阅读它以理解差异.
我已经在下面列出了每个代码.在我的机器上,VB在大约6.36秒内找到了348513个素数.C#在21.76秒内找到相同数量的素数.
我在那里测试的每台机器在C#和VB.NET之间的基准测试结果上都有明显的差异.
两个控制台应用程序都是在发布模式下编译的,但是否则没有从Visual Studio 2008生成的默认值更改项目设置.
Imports System.Diagnostics
Module Module1
Private temp As List(Of Int32)
Private sw As Stopwatch
Private totalSeconds As Double
Sub Main()
serialCalc()
End Sub
Private Sub serialCalc()
temp = New List(Of Int32)()
sw = Stopwatch.StartNew()
For i As Int32 = 2 To 5000000
testIfPrimeSerial(i)
Next
sw.Stop()
totalSeconds = sw.Elapsed.TotalSeconds
Console.WriteLine(String.Format("{0} seconds elapsed.", totalSeconds))
Console.WriteLine(String.Format("{0} primes found.", temp.Count))
Console.ReadKey() …Run Code Online (Sandbox Code Playgroud) 我有一个使用Fluent NHibernate 1.1的简单手机目录应用程序.在应用程序中,"Person"对象具有许多"PhoneNumber"对象.我正在尝试删除一个人,我想将删除级联到PhoneNumbers.我DefaultCascade.All()在阅读完这个答案后设定了一个惯例.但是,尝试删除父对象仍会引发异常 - 似乎NHibernate正在尝试更新子表以将父ID设置为null而不是仅删除记录:
{"无法删除集合:[Person.PhoneNumbers#473] [SQL:UPDATE phone_numbers SET person_id = null WHERE person_id = @ p0]"}
的InnerException:
{"无法将值NULL插入列'person_id',表'directory.dbo.phone_numbers';列不允许空值.UPDATE失败.\ r \n语句已终止."}
我的Fluent配置是:
public static ISessionFactory CreateSessionFactory() {
return Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008
.ConnectionString(ConfigurationManager.ConnectionStrings[ConfigurationManager.AppSettings["activeConnStr"]].ConnectionString))
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Person>()
.Conventions.Add(DefaultCascade.All())
)
.BuildSessionFactory();
}
Run Code Online (Sandbox Code Playgroud)
父类是:
public class Person {
public Person() {
PhoneNumbers = new List<PhoneNumber>();
EmailAddresses = new List<string>();
}
public virtual int Id { get; private set; }
public virtual string FirstName { get; set; }
public virtual string LastName …Run Code Online (Sandbox Code Playgroud) 我试图了解如何最好地扩展ListBox控件.作为一个学习的经验,我想建立一个ListBox其ListBoxItem场显示一个CheckBox,而不仅仅是文字.我使用了基本方式工作ListBox.ItemTemplate,明确设置我想要数据绑定的属性的名称.一个例子胜过千言万语,所以......
我有一个数据绑定的自定义对象:
public class MyDataItem {
public bool Checked { get; set; }
public string DisplayName { get; set; }
public MyDataItem(bool isChecked, string displayName) {
Checked = isChecked;
DisplayName = displayName;
}
}
Run Code Online (Sandbox Code Playgroud)
(我构建了一个列表并设置ListBox.ItemsSource为该列表.)我的XAML看起来像这样:
<ListBox Name="listBox1">
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding Path=Checked}" Content="{Binding Path=DisplayName}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Run Code Online (Sandbox Code Playgroud)
这有效.但我想让这个模板可重用,即我想要绑定到除"Checked"和"DisplayName"以外的属性的其他对象.我如何修改我的模板,以便我可以使它成为一个资源,在多个ListBox实例上重用它,并为每个实例绑定IsChecked和Content任意属性名称?
我有一个C#WPF应用程序,其中一个部分用作FTP客户端,列出远程服务器上的文件并允许用户下载它们.我希望用户能够将文件列表中的文件拖放到他们自己的机器上(即进入Windows资源管理器外壳).
为了实现这一点,我使用了Delay的博客中的VirtualFileDataObject代码,使用了Action<Stream>重载SetData.这适用于较小的文件.
我的问题是:我正在处理的一些文件非常大(2+ GB),并且VirtualFileDataObject类处理流的方式涉及将整个内容读入内存,最终会导致"存储空间不足"错误对于那些非常大的文件.
VirtualFileDataObject代码的相关部分如下.如何重写此代码以不要求整个流在内存中?
public void SetData(short dataFormat, int index, Action<Stream> streamData) {
_dataObjects.Add(
new DataObject {
FORMATETC = new FORMATETC {
cfFormat = dataFormat,
ptd = IntPtr.Zero,
dwAspect = DVASPECT.DVASPECT_CONTENT,
lindex = index,
tymed = TYMED.TYMED_ISTREAM
},
GetData = () => {
// Create IStream for data
var ptr = IntPtr.Zero;
var iStream = NativeMethods.CreateStreamOnHGlobal(IntPtr.Zero, true);
if (streamData != null) {
// Wrap in a .NET-friendly …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个Rails 3 rake任务来生成config/initializers/secret_token.rb.我想拉取应用程序的名称,而不是在rake任务中对其进行硬编码,但@app_name尚未填充,也不是ENV['APP_NAME'].这是任务的代码:
desc "Regenerate the server secret"
task :generate_secret do
include ActiveSupport
File.open('config/initializers/secret_token.rb', 'w') do |f|
f.puts "#{@app_name}::Application.config.secret_token = '#{SecureRandom.hex(30)}'"
end
end
Run Code Online (Sandbox Code Playgroud)
这一切都有效,除了@app_name空白.如何在此处检索应用程序名称?