小编Mat*_*ler的帖子

为什么C#比VB.NET更慢地执行Math.Sqrt()?

背景

在今天早上运行基准测试时,我和我的同事发现了一些关于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秒内找到相同数量的素数.

计算机规格和注释

  • 英特尔酷睿2四核6600 @ 2.4Ghz

我在那里测试的每台机器在C#和VB.NET之间的基准测试结果上都有明显的差异.

两个控制台应用程序都是在发布模式下编译的,但是否则没有从Visual Studio 2008生成的默认值更改项目设置.

VB.NET代码

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)

.net c# vb.net benchmarking

51
推荐指数
4
解决办法
3826
查看次数

流畅的NHibernate级联删除无法正常工作

我有一个使用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)

c# fluent-nhibernate

18
推荐指数
2
解决办法
2万
查看次数

如何使ListBox.ItemTemplate可重用/通用

我试图了解如何最好地扩展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# data-binding wpf itemtemplate

15
推荐指数
2
解决办法
3万
查看次数

将大型虚拟文件从C#拖放到Windows资源管理器中

我有一个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)

c# com drag-and-drop

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

如何在rake任务中获取Rails应用程序名称?

我正在尝试编写一个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空白.如何在此处检索应用程序名称?

ruby-on-rails ruby-on-rails-3

3
推荐指数
2
解决办法
5066
查看次数