代码执行速度:IronPython vs C#?

时间:2010-06-21 01:27:51

标签: ironpython

我试图从Managers的角度提出一个问题:如果我们用IronPython而不是C#编写应用程序,会产生什么样的整体性能损失?

这个问题是针对那些可能已经进行过一些测试,基准测试或完成从C#到IronPython的迁移的人,以量化惩罚。

4 个答案:

答案 0 :(得分:12)

我创建了一个C#控制台应用程序(我不太擅长C#), 它基本上使用xor密码加密输入文件。

以下代码:

using System;
using System.IO;
using System.Text;
using System.Diagnostics;

namespace XorCryptor
{
    class Program
    {
        public static void Main(string[] args)
        {
            if(args.Length != 3)
            {
                Console.WriteLine("Usage: xorcryptor password file_in.txt file_out.txt");
                Console.Write("Press any key to continue...");
                Console.ReadKey(true);
                return;
            }
            Stopwatch sw = Stopwatch.StartNew();
            BinaryReader infileb;
            try{
                infileb = new BinaryReader(File.Open(args[1], FileMode.Open));
            }catch(IOException){
                Console.WriteLine("Error reading from input file (is it in use by another program?)");
                return;
            }
            byte[] encb = Crypt(infileb.ReadBytes((int)infileb.BaseStream.Length),args[0]);
            infileb.Close();
            BinaryWriter outfileb;
            try{
                outfileb = new BinaryWriter(File.Open(args[2], FileMode.Create));
            }catch(IOException){
                Console.WriteLine("Error writing to output file (is it in use by another program?)");
                return;
            }
            outfileb.Write(encb);
            outfileb.Close();
            sw.Stop();
            Console.WriteLine("Size: "+encb.Length.ToString());
            Console.WriteLine("Elapsed milliseconds: "+sw.ElapsedMilliseconds.ToString());
        }
        internal static byte[] Crypt(byte[] text, string password)
        {
            int i2 = 0;
            byte[] result = new byte[text.Length];
            foreach(byte b in text)
            {
                result[i2] = Convert.ToByte(b ^ password[i2 % password.Length]);
                i2++;
            }
            return result;
        }
    }
}

然后是等效的Python版本,(我使用SharpDevelop 4.0来构建可执行文件):

import System
from System.IO import File, FileMode, BinaryReader, BinaryWriter
from System.Diagnostics import Stopwatch
import sys

def crypt(text, password):
    result = System.Array.CreateInstance(System.Byte, text.Length)
    for i, b in enumerate(text):
        result[i] = System.Convert.ToByte(b ^ ord(password[i % len(password)]))
    return result

argv = System.Environment.GetCommandLineArgs()

if len(argv) != 4:
    print "Usage: pyxorcryptor password file_in file_out"
    print "Press any key to exit...",
    System.Console.ReadKey(True)
    sys.exit(1)

sw = Stopwatch.StartNew()
try:
    infileb = BinaryReader(File.Open(argv[2], FileMode.Open))
    outfileb = BinaryWriter(File.Open(argv[3], FileMode.Create))
except IOException, e:
    print e.ToString()
    sys.exit(1)
encb = crypt(infileb.ReadBytes(int(infileb.BaseStream.Length)), argv[1])
infileb.Close()
outfileb.Write(encb)
outfileb.Close()
sw.Stop()

print "Size: {0}\nTime (ms): {1}".format(len(encb), sw.ElapsedMilliseconds)

使用相同的明文3,827 kb文件测试其速度, 我明白了:


<强> C#

  • 大小:3928779
  • 经过的毫秒: 73

适用于.NET 4.0的IronPython 2.6

  • 大小:3928779
  • 时间(毫秒):16825

所以我认为我们可以得出结论,IronPython明显比C#慢, 在这种特殊情况下。

我可能在我的代码中的那两个文件中出错,所以请随意指出它们。我还在学习。

答案 1 :(得分:6)

IronPython的性能总是比C#慢一点,因为它是解释语言。您可以在jcao219 answer上看到它,虽然这不是一个好例子。

但是开发速度实际上更重要的是性能。对于优秀的IronPython开发人员来说,在IronPython中开发应用程序比在C#中更快。当然,当你(和你的同事)在C#中更好时,你不应该考虑在IronPython中开发应用程序。

整体性能在很大程度上取决于代码的作用。 IronPython中的加密不是一个好主意。电子表格应用程序是个好主意 - 请参阅Resolver One。他们考虑过将代码从IronPython转换为C#,但他们还没有完成,因为它没有必要。当他们需要加速代码时,他们已经在IronPython中找到了一种方法来实现它。

答案 2 :(得分:2)

在单声道环境中,使用有限数量的基准测试,根据Computer Language Benchmarks Game Site,IronPython 2.6.1看起来比C#慢7到120倍。

答案 3 :(得分:-1)

根据我的理解,两种语言都会编译成MSIL,所以理论上应用程序的性能应该相同或非常接近,但还有更多,人为因素。

我可以向你保证,我用C#编写的程序可能比使用Iron-python中的相同程序快得多,不是因为C#更快,而是因为我对C#更熟悉,我知道要做出哪些选择,所以如果你的团队更熟悉C#,那么如果你的应用程序是用C#编写的,那么你的应用程序就有更好的性能。

这只是一个个人理论,所以要把它当作一粒盐。