LINUX.ORG.RU

Сравнение производительности доступа к полям структур в Python, Common Lisp и С++

 , cоmmon lisp, , ,


0

2

Помните, я сказал, что постараюсь не писать до конца сентября? Так вот: у меня не получилось :) Кому не нравится тут тег Яр - заверяю, что он не для рекламы (и так все уже знают), а исключительно для удобства: мне по нему удобно искать, а вам его удобно заигнорить. Отношение к Яру здесь такое: я мучаюсь, как мне реализовать объекты Яра. Склоняюсь к тому, что сделать их с опцией «реализовать как defstruct/clos». Но дальше идут тонкости, в которые сейчас не лезу.

Итак, я нашёл тред пиписькометрии 7 - летней давности: https://www.linux.org.ru/forum/development/4535326, и там сравнивалась скорость каких-то циклов. но это неинтересно. Интересно сравнивать скорость доступа к полям объектов хотя бы. Я попробовал. Вот что в итоге вышло (платформа 64 разрядная).

С++

// cpp-benchmark.cpp
#include "stdio.h"
#include <cstdlib>

class test_class {
public:
	int fld1, fld2, fld3, fld4, fld5;
        test_class *next;
};


int inner(test_class *o,int bound) {
    int res=0;
    for (int i=0;i<bound;i++) {
        res += o->fld1;
        o->fld2 = o->fld1;
        o->fld3 = o->fld2;
        o->fld4 = o->fld3;
        o->fld5 = o->fld4;
        o->fld1 = res - 1;
        o = o->next;
        res = res % 16;

    }    
    return res;
}

int main(int argc, char* argv[])
{
    test_class o1;
    test_class o2;
    o1.fld1=1;
    o2.fld1=1;
    o1.next=&o2;
    o2.next=&o1;
    int n = 100*1000*1000;
    int result=inner(&o1,n);
    printf("%d %d\n",o1.fld5,result); // проверяем корректность и чтобы оптимизатор
    // не выкинул неиспользуемый код
    return 0;
}
// EOF
// запускаем:
g++ -O2 -o cpp-benchmark cpp-benchmark.cpp ; echo disassemble inner | gdb cpp-benchmark ; time ./cpp-benchmark 
// листинг пропускаю.

real	0m0.225s
user	0m0.216s
sys	0m0.004s

Лисп на структурах:

;; struct-benchmark.lisp
(in-package :cl-user)

(list
 '#.(restrict-compiler-policy 'safety)
 '#.(restrict-compiler-policy 'debug))
 
(declaim
 (optimize (speed 3) (safety 0) (debug 0)
           (space 0) (compilation-speed 0)))

(defparameter *times* (* 100 1000 1000))

(defstruct test-struct 
  (next nil :type (or null test-struct))
  (fld1 0 :type fixnum)
  (fld2 0 :type fixnum)
  (fld3 0 :type fixnum)
  (fld4 0 :type fixnum)
  (fld5 0 :type fixnum)
  )

(declaim (inline test-struct-fld1 test-struct-fld2 test-struct-fld3 test-struct-fld4 test-struct-fld5 (setf test-struct-fld1) (setf test-struct-fld2) (setf test-struct-fld3) (setf test-struct-fld4) (setf test-struct-fld5)
                    test-struct-next))

(defun inner (o n)
  (declare (type test-struct o))
  (declare (type fixnum n))
  (let ((res 0))
    (declare (type fixnum res))
    (dotimes (i n)
      (incf res (the fixnum (test-struct-fld1 o)))
      (setf (test-struct-fld2 o) (test-struct-fld1 o)
            (test-struct-fld3 o) (test-struct-fld2 o)
            (test-struct-fld4 o) (test-struct-fld3 o)
            (test-struct-fld5 o) (test-struct-fld4 o)
            (test-struct-fld1 o) (- res 1)
            o (test-struct-next o)
            res (mod res 16)))
    res))

(defun main ()
  (let* ((o1 (make-test-struct :fld1 1))
         (o2 (make-test-struct :fld1 1 :next o1))
         res)
    (setf (test-struct-next o1) o2)
    (setf res (inner o1 *times*))
    (format t "~S~%~S~%" (test-struct-fld5 o1) res)))

(let ((*trace-output* *standard-output*))
  (time (main)))
;;;; EOF
;; запускаем
>(load (compile-file "~/py/struct-benchmark.lisp"))
  0.394 seconds of real time
  0.436000 seconds of total run time (0.436000 user, 0.000000 system)
Лисп, но вместо inline ставим notinline - все аксессоры превращаются в полноценные функции. Получаем
real time 3.879 seconds
Лисп на CLOS:
;; clos-benchmark-with-types.lisp
(in-package :cl-user)

(list
 '#.(restrict-compiler-policy 'safety)
 '#.(restrict-compiler-policy 'debug))
 
(declaim
 (optimize (speed 3) (safety 0) (debug 0)
           (space 0) (compilation-speed 0)))

(defparameter *times* (* 100 1000 1000))

(defclass test-class-3 ()
  ((fld1 :initarg :fld1 :accessor test-class-3-fld1)
   (fld2 :accessor test-class-3-fld2)
   (fld3 :accessor test-class-3-fld3)
   (fld4 :accessor test-class-3-fld4)
   (fld5 :accessor test-class-3-fld5)
   (next :initarg :next :accessor test-class-3-next)))

(defun inner (o n)
  (declare (type fixnum n))
  (declare (type test-class-3 o))
  (let ((res 0))
    (declare (type fixnum res))
    (dotimes (i n)
      (incf res (the fixnum (test-class-3-fld1 o)))
      (setf (test-class-3-fld2 o) (the fixnum (test-class-3-fld1 o))
            (test-class-3-fld3 o) (the fixnum (test-class-3-fld2 o))
            (test-class-3-fld4 o) (the fixnum (test-class-3-fld3 o))
            (test-class-3-fld5 o) (the fixnum (test-class-3-fld4 o))
            (test-class-3-fld1 o) (the fixnum (- res 1))
            o (test-class-3-next o)
            res (mod res 16)))
    (print res)
    res))

(defun main()
  (let* (
         (o1 (make-instance 'test-class-3 :fld1 1))
         (o2 (make-instance 'test-class-3 :fld1 1 :next o1))
         res)
    (setf (test-class-3-next o1) o2)
    (setf res (inner o1 *times*))
    (format t "~S~%~S~%" (test-class-3-fld5 o1) res)))

(let ((*trace-output* *standard-output*))
  (time (main)))
#|
6.115секунд
|#

python:

# ~/py/oop-benchmark.py
import time

__times__ = 100*1000*1000

class TestClass3(object):
  
    def __init__(self):
        self.fld1 = 1
        self.fld2 = 0
        self.fld3 = 0
        self.fld4 = 0
        self.fld5 = 0
        self.next = self

def inner(o,count):
    res = 0
    for i in xrange(count):
        res += o.fld1
        o.fld2 = o.fld1
        o.fld3 = o.fld2
        o.fld4 = o.fld3
        o.fld5 = o.fld4
        o.fld1 = res - 1
        o = o.next;
        res = res % 16
    return res

def my_main():
    o1 = TestClass3()
    o2 = TestClass3()
    o1.next = o2
    o2.next = o1
    res = inner(o1,__times__)
    print '%s' % o1.fld5
    print '%s' % res

my_main()

# запуск:
#time python oop-benchmark.py 
#266666656
#3
#real	0m51.031s
#user	0m50.696s
#sys	0m0.052s
FreePascal
{oop-benchmark.fpc}
{$mode ObjFPC}
const n=100*1000*1000;
type
  PTest = ^TTest;
  TTest = object
  public
    fld1, fld2, fld3, fld4, fld5: Integer;
    next: PTest;
  end;

function inner(o: PTest; bound: Integer): Integer;
var i: Integer;
begin
  Result:=0;
  for i:=0 to bound-1 do with o^ do begin
    Result:=Result+fld1;
    fld2:=fld1;
    fld3:=fld2;
    fld4:=fld3;
    fld5:=fld4;
    fld1:=Result-1;
    o:=next;
    Result:=Result mod 16;
  end;
end;

var
  o1, o2: TTest;
  b: Integer;
begin
  o1.fld1:=1; o1.next:=@o2;
  o2.fld1:=1; o2.next:=@o1;
  b:=inner(@o1,n);
  WriteLn(o1.fld5,' ',b);
end.
{

fpc -O3 oop-benchmark.fpc
Free Pascal Compiler version 2.6.4+dfsg-4 [2014/10/14] for x86_64
Copyright (c) 1993-2014 by Florian Klaempfl and others
Target OS: Linux for x86-64
Compiling oop-benchmark.fpc
Linking oop-benchmark
/usr/bin/ld.bfd: warning: link.res contains output sections; did you forget -T?
36 lines compiled, 0.1 sec 
1 warning(s) issued
den73@deb8:~/py$ time ./oop-benchmark
266666656 3

real	0m1.810s
user	0m1.776s
sys	0m0.008s
}

cython, pypy

##########
# test.pyx file

import cython

cdef class TestClass:

    cdef public unsigned int fld1, fld2, fld3, fld4, fld5
    cdef public object next
    
    def __cinit__(self):
        self.fld1 = 1
        self.fld2 = 0
        self.fld3 = 0
        self.fld4 = 0
        self.fld5 = 0
        self.next = self

@cython.overflowcheck(False)
@cython.cdivision(True)
cdef inner(TestClass o, count):
    cdef unsigned int res = 0, i
    for i in range(count):
        res += o.fld1
        o.fld2 = o.fld1
        o.fld3 = o.fld2
        o.fld4 = o.fld3
        o.fld5 = o.fld4
        o.fld1 = res - 1
        o = o.next;
        res = res % 16
    return res

def main():
    cdef TestClass o1, o2
    o1 = TestClass()
    o2 = TestClass()
    o1.next = o2
    o2.next = o1
    res = inner(o1, 100_000_000)
    print('%s' % o1.fld5)
    print('%s' % res)

##########
# setup.py file

from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize

# to compile a module:
# python setup.py build_ext --inplace

extensions = [
    Extension('test', ['test.pyx'],
              extra_compile_args=['-O3'])
]

setup(name = 'access attrs benchmark',
      ext_modules = cythonize(extensions, annotate=True),
)

#########
# main.py file

from test import *
main()

# Запуск с помощью pip 
# 1. Создать ТРИ файла, исходник которых дан выше
# 2. В этой директории:
python setup.py build_ext --inplace
time python main.py

# Результаты:
real	0m0.306s
user	0m0.304s
sys	0m0.004s

$ time pypy oop-benchmark.py 
266666656
3

real	0m0,761s
user	0m0,736s
sys	0m0,020s

EMACS Lisp - несколько быстрее Питона.

★★★★★

Последнее исправление: den73 (всего исправлений: 17)

Ответ на: комментарий от tp_for_my_bunghole

Было предложено аргументировать конкретно в контексте алгоритмов и структур, но анонимус не знает ни Python, ни структур судя по всему. «Настоящий программист».

А зачем астрономам и ботаникам знать алгоритмы и структуры?

А, вот они, те загадочные нормальные языки в отличии от Python, которые умалчивались на предыдущей странице.

Я вообще-то не свое мнение выразил, а констатировал факт. Но должен признаться - в сортах веба я разбираюсь плохо.

«Посвяти свою жизнь программированию». Тема исчерпана.

Как хочешь, все равно от тебя никакой конкретики. Сразу видно, что ты не технарь, поэтому и дискутировать с тобой на эту тему толку ноль.

anonymous
()
Ответ на: комментарий от anonymous

Как хочешь, все равно от тебя никакой конкретики. Сразу видно, что ты не технарь, поэтому и дискутировать с тобой на эту тему толку ноль

Потому что ты НЕ МОЖЕШЬ. Достаточно пройти по твоим комментам.
Чтобы быть технарем недостаточно об этом заявить.
Я предлагал тебе перейти от балабольства к конкретике. Было проигнорировано.

tp_for_my_bunghole
()
Последнее исправление: tp_for_my_bunghole (всего исправлений: 1)
Ответ на: комментарий от tp_for_my_bunghole

Тогда мог бы ты задавать вопросы поконкретнее? Интересуют алгоритмы и структуры? Могу посоветовать Стивена Скиену, пишет понятно, не сухо, для питониста самое-то. Только не уверен, что оно тебе надо.

anonymous
()
Ответ на: комментарий от anonymous

Тогда мог бы ты задавать вопросы поконкретнее?

Зачем, если понятно что ты не можешь на них ответить.
У тебя софизмы и слова без определений.

Могу посоветовать Стивена Скиену, пишет понятно, не сухо, для питониста самое-то. Только не уверен, что оно тебе надо.

Steven Skiena биолог, использует Python.

Но об особенностях реализации языков программирования ты пока не готов судить. Книги о фундаментальных структурах предлагаешь.

tp_for_my_bunghole
()
Ответ на: комментарий от tp_for_my_bunghole

Тогда мог бы ты задавать вопросы поконкретнее?

Зачем, если понятно что ты не можешь на них ответить.

Телепаты в треде!

Steven Skiena биолог

Он не биолог, он профессор CS.

использует Python

Ну я же не просто так его посоветовал. Или тебе Кнут ближе?

Но об особенностях реализации языков программирования ты пока не готов судить.

Я и не начинал судить об особенностях. Мне это ни к чему.

Книги о фундаментальных структурах предлагаешь.

Ну ты хотел от меня что-то, но вопроса прямого так и не задал, цитировал мои слова про структуры и алгоритмы зачем-то, вот я и подумал, что ты не знаешь что это. Впрочем, я не удивлен...

anonymous
()
Ответ на: комментарий от anonymous

Он не биолог, он профессор CS.

Steven Skiena занимается алгоритмами и их применением в биологии. И ты не подозревал что он использует Python для лекций, просто его книги популярны.

Или тебе Кнут ближе?

Donald E. Knuth, «Structured Programming with goto Statements», 1974:

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

(We will perhaps eventually be writing only small modules which are identified by name as they are used to build larger ones, so that devices like indentation, rather than delimiters, might become feasible for expressing local structure in the source language.)

В C++ этого нет до сих пор. Во Free Pascal/Delphi есть давно(unit).

цитировал мои слова про структуры и алгоритмы зачем-то, вот я и подумал, что ты не знаешь что это

Ты по себе судил.

tp_for_my_bunghole
()
Ответ на: комментарий от tp_for_my_bunghole

Steven Skiena занимается алгоритмами и их применением в биологии.

Он много где применял свои навыки, об этом он пишет в своих книгах, которые ты очевидно не читал. Это не делает его биологом. Программист, написавший софт для автоматизации доения - не становится дояркой.

И ты не подозревал что

Ну точно экстрасенс какой-то!

он использует Python для лекций, просто его книги популярны.

Он преподает CS в университете, его курс посещают не только будущие программисты, поэтому не вижу в этом ничего удивительного.

Ты по себе судил.

А ты сейчас по себе судишь, что я по себе судил?

anonymous
()
Ответ на: комментарий от tp_for_my_bunghole

Ты очень хочешь показать что Python это какой-то низкий уровень

Высокий уровень — это Lisp, Haskell, Smalltalk, ML, Prolog, Tcl, shell и т. д.

А питон-говнина — недоязычок для идиотов.

anonymous
()
Ответ на: комментарий от tp_for_my_bunghole

А можно не флудить?

den73 ★★★★★
() автор топика
Ответ на: комментарий от anonymous

об этом он пишет в своих книгах, которые ты очевидно не читал. Это не делает его биологом.

Аналогично, прочитав его книгу ты не становишься программистом.

А можно не флудить?

Врядли здесь появится ещё кто-то способный показать тест, например на TCL.

Высокий уровень — это Lisp, Haskell, Smalltalk, ML, Prolog, Tcl, shell и т. д. А питон-говнина — недоязычок для идиотов.

По такому определения питон идеален для тебя. Python кстати содержит TCL/Тк полностью как часть своей стандартной библиотеки.
В TCL только один тип - строка.
Если написать этот тест на TCL, то будет трудно дождаться когда он закончится.

tp_for_my_bunghole
()
Ответ на: комментарий от tp_for_my_bunghole

Аналогично, прочитав его книгу ты не становишься программистом.

Не спорю. Но без знания алгоритмов и структур нельзя стать нормальным программистом, впрочем, питонистов это не касается, т.к. им эти знания ни к чему. Не обязательно знать принципы работы микроволновки, чтобы ею пользоваться.

anonymous
()
Ответ на: комментарий от tp_for_my_bunghole

Вставил твой пример в пост.

den73 ★★★★★
() автор топика
Ответ на: комментарий от tp_for_my_bunghole

Врядли здесь появится ещё кто-то способный показать тест, например на TCL.

Я могу, но мне лень. Tcl не быстр, хотя может быть и быстрее python.

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от tp_for_my_bunghole

Python кстати содержит TCL/Тк полностью как часть своей стандартной библиотеки.

Там обычный биндинг к Tk. Свой тулкит на говнине написать так и не смогли.

Если написать этот тест на TCL, то будет трудно дождаться когда он закончится.

Ой, посмотрите-ка, кто заговорил о производительности. Еще чуть-чуть и пойдут простыни ассемблерного кода.

Что и требовалось доказать, из всего списка питонофил только про тулкит что-то краем уха слышал.

anonymous
()
Ответ на: комментарий от den73

Я могу, но мне лень. Tcl не быстр, хотя может быть и быстрее python.

TCL намного медленнее чем Python, потому что TCL просто интерпретация строк с сохранением результата интерпретации типа во внутреннем кэше для оптимизации.

Но есть Critcl для C вставок, похоже на либу CFFI в Python. Только в CFFI есть ещё и режим бинарной совместимости без компиляции, через libffi(ненадёжный).

anonymous обиделась...

Там обычный биндинг к Tk. Свой тулкит на говнине написать так и не смогли

Там и Tk, и полный интерпретатор TCL:

tkinter.Tcl(screenName=None, baseName=None, className=’Tk’, useTk=0)

Tk принимает текстовые команды и выполняет их в TCL.

GUI на Python это Kivy, на основе OpenGL - вездесущий стандарт ES 2.0(Linux, Windows, OS X, Android, iOS, Raspberry Pi).
Для touch устройств, джойстиков. Критические участки написаны на Cython.
Можно использовать шейдеры, в OpenGL это текст, строка которую кидаешь в OpenGL где она компилируется на лету.

tp_for_my_bunghole
()
Ответ на: комментарий от tp_for_my_bunghole

Там и Tk, и полный интерпретатор TCL:

Python настолько убог, что пришлось встраивать Tcl в стандартную библиотеку. Только все равно говнище вышло.

Python:

from Tkinter import *

class Application(Frame):
    def say_hi(self):
        print "hi there, everyone!"

    def createWidgets(self):
        self.QUIT = Button(self)
        self.QUIT["text"] = "QUIT"
        self.QUIT["fg"]   = "red"
        self.QUIT["command"] =  self.quit

        self.QUIT.pack({"side": "left"})

        self.hi_there = Button(self)
        self.hi_there["text"] = "Hello",
        self.hi_there["command"] = self.say_hi

        self.hi_there.pack({"side": "left"})

    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack()
        self.createWidgets()

root = Tk()
app = Application(master=root)
app.mainloop()
root.destroy()

Tcl:

button .hello -text "Hello, World!" -command { exit }
pack .hello

anonymous
()
Ответ на: комментарий от anonymous

Python настолько убог, что пришлось встраивать Tcl в стандартную библиотеку. Только все равно говнище вышло.

pip install cython kivy

На GNU/Linux откроет окно дефолтного размера(800х600) в GTK с OpenGL ES 2.0 контекстом, с чёрным фоном и заголовком «My»:

from kivy.app import App

class MyApp(App): pass
MyApp().run()

Далее можно добавлять widgets, обработчики событий. Полная информация о конфигурации системы отображается в терминале в приятном формате.

tp_for_my_bunghole
()

Emacs Lisp. ~41.504390 seconds;
Интересно, производительность на уровне интерпретатора Python со __slots__ в классе, это очень хорошо.

(defvar *times*)
(setq *times* (* 100 1000 1000))

(defstruct (el-test-struct (:type vector)) 
  next fld1 fld2 fld3 fld4 fld5)

(defun el-test-inner (o n) 
  (let ((res 0))
    (dotimes (i n)
      (incf res (el-test-struct-fld1 o))
      (setf (el-test-struct-fld2 o) (el-test-struct-fld1 o)
            (el-test-struct-fld3 o) (el-test-struct-fld2 o)
            (el-test-struct-fld4 o) (el-test-struct-fld3 o)
            (el-test-struct-fld5 o) (el-test-struct-fld4 o)
            (el-test-struct-fld1 o) (- res 1)
            o (el-test-struct-next o)
            res (mod res 16)))
    res))

(defun el-test-main ()
  (let* ((o1 (make-el-test-struct :fld1 1))
         (o2 (make-el-test-struct :fld1 1 :next o1))
         res)
    (setf (el-test-struct-next o1) o2)
    (let ((time (current-time)))
      (setf res (el-test-inner o1 *times*))
      ;; show time passed
      (message "%.06f" (float-time (time-since time))))
    (format "%d %d" (el-test-struct-fld5 o1) res)))

Скопировать в буфер, скомпилировать «M-x byte-compile-file», в *scratch* буфере загрузить «C-x-e» для каждой формы, результаты в буфере *Messages*:

(load "~/ your path /elisp_test/test.elc")
(el-test-main)
tp_for_my_bunghole
()
Последнее исправление: tp_for_my_bunghole (всего исправлений: 1)

Тут следует разделить категории: нативные и ненативные ЯП. Ведь интерпретаторы ненативных ЯП написаны на нативных ЯП.

KennyMinigun ★★★★★
()
Ответ на: комментарий от tp_for_my_bunghole

Не, это я уж не буду вносить. Хочешь - можно завести репозиторий для таких тестов. Правда, и сам тест не особо-то хорош.

den73 ★★★★★
() автор топика
Ответ на: комментарий от KennyMinigun

Пользователю по барабану, нативный язык или нет. Его интересует результат. Кроме того, JIT сильно смазывает границу.

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

Пользователю по барабану, нативный язык или нет.

Ровно до тех пор, пока какая-то технология не начинает ставить палки в колеса (например не работать с прокси).

Его интересует результат.

ППКС

Кроме того, JIT сильно смазывает границу.

JIT конечно крут, но доступ к полям слишком примитивная низкоуровневая операция чтоб он смог что-то показать реально.

KennyMinigun ★★★★★
()
Ответ на: комментарий от KennyMinigun

JIT конечно крут, но доступ к полям слишком примитивная низкоуровневая операция чтоб он смог что-то показать реально.

А что по твоему должен оптимизировать JIT? Как раз в рамках метода он и работает в основном. Межпроцедурная оптимизация это уже сложная и малоизведанная область.

anonymous
()
Ответ на: комментарий от den73

Не, это я уж не буду вносить.

Мне было интересно сравнить Elisp именно в таком тесте раз есть возможность, и Elisp понравился в очередной раз.

Пользователю по барабану, нативный язык или нет. Его интересует результат. Кроме того, JIT сильно смазывает границу.

Пользователь языка программирования это программист. И здесь от нативности/ненативности ничего не зависит(за исключением особых случаев).
JIT это чёрный ящик. К непредсказуемости трассирующего сборщика мусора добавляется трассирование горячих участков кода для компиляции на лету.
Если есть C компилятор для процессора - проблема переноса языка без JIT решена.
Таргетирование компиляторов языков на «байткод» LLVM мне кажется сомнительным подходом, корпоративным.

Так как работает Emacs Lisp с использованием своего C API - так не смог бы ни один JIT. Другой хорошой пример Python API в Blender 3D.

Из реализаций Scheme нравится только Chicken, лучше чем ECL(Common Lisp) компилятор. Но ECL был в стагнации долго и в прошлом году нашёлся новый разработчик.

tp_for_my_bunghole
()
Последнее исправление: tp_for_my_bunghole (всего исправлений: 1)
Ответ на: комментарий от tp_for_my_bunghole

Результат «чуть лучше тормозного Питона» не является достижением. И кроме того, это уже второй язык, который меня изначально не интересовал - первый был FreePascal. Наконец, размер поста уже давно вылез за разумные рамки и результаты смотреть неудобно. И вроде есть ограничение по времени на редактирование поста.

Ладно, я могу поставить ссылку на твои измерения из поста. Но в целом это уже должен репозиторий.

den73 ★★★★★
() автор топика
Ответ на: комментарий от KennyMinigun

JIT конечно крут, но доступ к полям слишком примитивная низкоуровневая операция чтоб он смог что-то показать реально.

Думаю, если ты проверишь это, ты сильно удивишься. Но лично мне проверять лень.

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

Но лично мне проверять лень.

Аналогично ;-) Lets agree to disagree

KennyMinigun ★★★★★
()
Ответ на: комментарий от den73

Меня не очень интересует помещение в пост. Я тестировал для себя.

Может быть тормозной тот кто интерпретатор Python сравнивает с C++ на числах и доступе к структурам. Elisp на равне с Python, быстрее он только версии в ориг. посте;

Python быстрее чем C++ в тесте regex-redux на http://benchmarksgame.alioth.debian.org

Тест reverse-complement тестирует hash таблицы. C++/C в этом тесте просто обманывает, нечитаемый код который даёт правильный результат но полностью не соответствует СУТИ теста.
Python практически быстрее.

Но это врядли смогут понять многие в рунете, дегенеративная среда для IT.

Scheme полностью разочаровал как язык в процессе более тщательного ознакомления с Common Lisp со временем.

tp_for_my_bunghole
()
Ответ на: комментарий от tp_for_my_bunghole

Но это врядли смогут понять многие в рунете, дегенеративная среда для IT.

То что ты дегенеративные - понятно. Зачем пытаешься убедить всех в очевидном?

anonymous
()
Ответ на: комментарий от anonymous

То что ты дегенеративные - понятно

Временные последствия эпизодического присутствия в рунете. Все эти анонимусы представляются как собирательный образ собеседников влоггера «АНДРЕЙ ПОЛТАВА» на youtube.

tp_for_my_bunghole
()
$ time python oop-benchmark.py 
266666656
3

real	0m50,119s
user	0m50,000s
sys	0m0,112s
$ time pypy oop-benchmark.py 
266666656
3

real	0m3,263s
user	0m0,812s
sys	0m0,084s
screamager
()
Ответ на: комментарий от den73

Я не шарю, cython вроде не совсем python, а pypy это jit реализация python, написанная на rpython. Возможно как раз rpython и можно сравнивать с cython. Я запостил к тому, что стоит сравнивать более быстрые реализации, cl для примера брался не clisp, наверно.

screamager
()
Ответ на: комментарий от screamager

Я с cython-ом сравнил, см. в посте - он гораздо быстрее. А pypy - это 100% чистый питон, полностью совместимый? Почему вообще обычный питон всё ещё существует?

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

pypy это полная реализация python, но возможно есть различия в сравнении с cpython, скорей всего в каких-то отдельных модулях написанных не на питоне. Я вот тоже удивляюсь, возможно есть объективные причины, а может просто инерция.

screamager
()
Ответ на: комментарий от screamager

Понял, ну я могу добавить результаты в пост, но вопрос такой: почему user + sys намного меньше 3 секунд?

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от screamager

Это уже лучше. Интересен статус pypy. Если он прям хорош, то мой проект под угрозой, ну, не целиком, а отчасти.

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

Статус непонятный, вроде работает хорошо, и много проектов на нем работают, типа ipython, django, но его даже в дистрибутивы не включают, в opensuse нужно подключать дополнительный репозиторий, в ubuntu есть только для второго питона.

screamager
()
Ответ на: комментарий от den73

Проверка на соответствие типу там есть. А чтобы знать тип объекта, то разве не нужно хранить этот тип в самом объекте? И много языков так делают?

screamager
()
Ответ на: комментарий от screamager

Проверка на соответствие типу там есть

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

А чтобы знать тип объекта, то разве не нужно хранить этот тип в самом объекте?

Динамически типизированный язык с точной сборкой мусора вынужден хранить достаточно много информации о типе. Нужно знать, как минимум, размер объекта и какие поля в нём являются ссылками на другие объекты. Также нужно как-то реализовать проверки на соответствие типу. Это в целом дешевле, чем знание точного типа, но разница мне представляется очень малой. Возможно, я ошибаюсь.

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от den73

Сравнение питона с си некорректно. Python - не язык общего назначения. Корректнее его сравнивать с awk, perl, tcl, lua, scheme. Там он вполне на уровне. Iron-bug разочаровала узостью мышления типа мне не нужно никому не нужно. На реальных задачах - обработать текстовый файл, скачать и распарсить html страницу у вас не будет разницы в сотни раз в скорости выполнения программ на с и Питоне. Зато на написание, отладку и сопровождение скрипта потребуется меньше времени а для бизнеса — денег.

anonymous
()
Ответ на: комментарий от anonymous

Железножук давно уже никого не может разочаровать, о чём ты. «Всё, что не сишка с плюсами — не достойно существования.»

Virtuos86 ★★★★★
()
Ответ на: комментарий от Virtuos86

Нашел тест скриптовых встраиваемых языков. https://github.com/r-lyeh/scriptorium Тестовый скрипт - расчет чисел Фиббоначи. Замеряется время выполнения вместе с компиляцией скрипта. (для visual c тест не совсем корректный - считается только время выполнения exe-шника) Для себя нашел интересный проект - c4, c4/jit - интерпретатор Си в 600 строк. И jit-компилятор для него в 86 строчек! По скорости быстрее tcc (c учетом времени компиляции) и немного медленнее luajit. Изобретателям собственных языков\компиляторов рекомендую ознакомится.

anonymous
()
Ответ на: комментарий от anonymous

У нас из изобретателей только den73. Остальные предпочитают использовать уже изобретенное и похваляться оным, будто это их заслуга.

Virtuos86 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.