Скорость выполнения кода: IronPython против C #? - PullRequest
7 голосов
/ 21 июня 2010

Я пытаюсь дать ответ с точки зрения менеджеров на вопрос: какое общее снижение производительности мы понесем, если напишем приложение на IronPython вместо C #?

Этот вопрос предназначен для тех, кто, возможно, уже провел некоторое тестирование, бенчмаркинг или выполнил переход с C # на IronPython, чтобы количественно оценить штраф.

Ответы [ 4 ]

12 голосов
/ 21 июня 2010

Я создал консольное приложение 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)

Тестирование их скорости с одним и тем же открытым текстом 3827 кб, Я получаю это:


C #

  • Размер: 3928779
  • Прошедшие миллисекунды: 73

IronPython 2.6 для .NET 4.0

  • Размер: 3928779
  • Время (мс): 16825

Так что я думаю, мы можем заключить, что IronPython значительно медленнее, чем C #, в этом конкретном сценарии.

Возможно, я допустил ошибку где-то в своем коде в этих двух файлах, поэтому не стесняйтесь указывать на них. Я все еще учусь.

6 голосов
/ 21 июня 2010

Производительность IronPython всегда будет немного ниже, чем в C #, потому что это интерпретируемый язык. Вы можете увидеть это на jcao219 answer , хотя это не очень хороший пример.

Но скорость разработки на самом деле важнее, чем производительность. Разработка приложений в IronPython быстрее, чем в C # для хорошего разработчика IronPython. Конечно, вы не должны рассматривать разработку приложений в IronPython, когда вы (и ваши коллеги) лучше в C #.

Общая производительность в значительной степени зависит от того, что делает код. Шифрование в IronPython не является хорошей идеей. Приложение с электронными таблицами - хорошая идея - см. Resolver One. Они думали о преобразовании кода из IronPython в C #, но они еще этого не сделали, потому что в этом нет необходимости. Когда им понадобилось ускорить код, в самом IronPython нашли способ, как это сделать.

2 голосов
/ 21 июня 2010

В моно-среде, использующей ограниченное количество тестов, IronPython 2.6.1 выглядит в 7–120 раз медленнее, чем C #, согласно Game Language Benchmarks Game Site .

0 голосов
/ 21 июня 2010

Исходя из моего понимания, оба языка будут скомпилированы в MSIL, так что теоретически производительность приложения должна быть одинаковой или очень близкой, но это намного больше, человеческий фактор.

Я могу заверитьВы знаете, что программа, которую я пишу на C #, может быть намного быстрее, чем та же самая программа на iron-python, не потому, что C # быстрее, а потому, что я лучше знаком с C # и знаю, что делать, так что если ваша команда более знакомас C # ваше приложение имеет больше шансов на производительность, если оно написано на C # или наоборот.

Это всего лишь личная теория, так что принимайте ее с большой долей соли.

...