Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Курилка программистов
GAMEINATOR forums > Soft, Hard и периферия > Hard & Soft
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9
1001v
RayTwitty, возьми скопируй своей функцией {field1: null}, будет прикол.
RayTwitty
Цитата(1001v @ 17.12.2016, 19:23) *
возьми скопируй своей функцией {field1: null}, будет прикол.

Да, надо на пустое значение проверять. Заодно засунул в Object.
Код
Object.prototype.copy = (obj) => {
    if (obj) {
        if (typeof obj != 'object')
            return obj

        let copy = obj.constructor()
        for (let key in obj) {
            if (typeof obj[key] == 'object')
                copy[key] = this.copy(obj[key])
            else
                copy[key] = obj[key]
        }

        return copy
    }
}
1001v
RayTwitty, тебе разве не все поля: значения надо скопировать?
RayTwitty
Цитата(1001v @ 17.12.2016, 20:45) *
тебе разве не все поля: значения надо скопировать?

Да, все. Но когда там null, это достаточно специфичный момент) Теперь и его учитывает.
Код
Object.prototype.copy = (obj) => {
    if (!obj)
        return null

    if (typeof obj != 'object')
        return obj

    let copy = obj.constructor()
    for (let key in obj) {
        if (typeof obj[key] == 'object')
            copy[key] = this.copy(obj[key])
        else
            copy[key] = obj[key]
    }

    return copy
}
1001v
А если у меня объект без конструктора?
RayTwitty
Цитата(1001v @ 17.12.2016, 22:38) *
А если у меня объект без конструктора?

Имеешь ввиду так?
Код
let obj = new Object()

Тогда наверно надо добавить затычку в начало:
Код
if (!Object.keys(obj).length)
    return new Object()

---------------------------------------------------

Есть тут еще одна интересная задачка. Возможно плохо гуглил, но стандартных функций по этому поводу не нашел.
Есть некоторый объект, который находится внутри другого объекта. Как получить родительский объект? Пока не придумал ничего лучше, чем передать корневой объект и уже в нем искать дочерний. Если мы нашли дочерний, то возвращаем тот, внутри которого нашли.
Основной минус в том, что нужно знать корневой объект на старте.
Код
let getParent = (rootObj, childObj) => {
    if (childObj) {
        for (let i in rootObj) {
            let key = rootObj[i]

            // is object
            if (typeof key == 'object' && !Array.isArray(key)) {
                if (key == childObj)
                    return rootObj

                let res = getParent(key, childObj)
                if (res)
                    return res
            }
        }
    }

    return null
}
1001v
Цитата(RayTwitty @ 18.12.2016, 23:26) *
Имеешь ввиду так?

Имею ввиду вот так: Object.create(null)
Цитата(RayTwitty @ 18.12.2016, 23:26) *
Как получить родительский объект?

Если речь не о родительском прототипе, то тогда только поиском из корня.
RayTwitty
Цитата(1001v @ 18.12.2016, 23:57) *
Имею ввиду вот так: Object.create(null)

Наверно как-то так.
Код
Object.prototype.copy = (obj) => {
    if (!obj)
        return null

    if (typeof obj != 'object')
        return obj

    let res = Object.getPrototypeOf(obj) ? obj.constructor() : Object.create(null)

    if (Object.keys(obj).length) {
        for (let key in obj) {
            if (typeof obj[key] == 'object')
                res[key] = this.copy(obj[key])
            else
                res[key] = obj[key]
        }
    }

    return res
}

Если ты хочешь тут что-то допиливать, необязательно спрашивать у меня, можешь и сам правильный код сразу закидывать))
1001v
RayTwitty,
а если так?
Код
let manyCoolMethods = Object.create(null)
manyCoolMethods.coolMethod1 = x => x;
let obj = Object.create(manyCoolMethods)
let copy = Object.copy(obj)
RayTwitty
Цитата(1001v @ 19.12.2016, 00:51) *
а если так?

Не, это уже извраты какие-то. Если хочешь, доделывай сам))
RayTwitty
Цитата(RayTwitty @ 18.12.2016, 23:26) *
Как получить родительский объект?

Придумал кое-что получше - после инициализации объекта прогоняем его через функцию:
Код
let scan = obj => {
    let last
    for (let key in obj) {
        key = obj[key]

        if (typeof key == 'object' && !Array.isArray(key)) {
            scan(key)

            key.$parent = obj
            key.$last = last
            last = key
        }
    }
}

В итоге у каждого объекта появляются ключевые поля с ссылками на родительский объект и на предыдущий (мне это было нужно в задаче). После чего, по объекту можно удобно ходить как по дереву, не вызывая каждый раз кучу циклов.
1001v
Цитата(RayTwitty @ 19.12.2016, 15:01) *
Не, это уже извраты какие-то. Если хочешь, доделывай сам))

Это просто демонстрация того факта, что не у любого объекта с прототипом бывает конструктор.
RayTwitty
Кстати интересный момент:
Код
Object.prototype.copy = (obj) => {}

После добавления функции в прототип Object, элемент copy появляется во всех объектах.

Код
Object.prototype.copy = (obj) => {}
let obj = {name: 'Ivan'}
console.log(obj)

=>
Код
[object Object] {
  copy: (obj) => {},
  name: "Ivan"
}

Похоже, добавлять функцию нужно так:
Код
Object.copy = (obj) => {}
1001v
Цитата(RayTwitty @ 21.12.2016, 23:18) *
После добавления функции в прототип Object, элемент copy появляется во всех объектах.

Цитата(RayTwitty @ 21.12.2016, 23:18) *
Похоже, добавлять функцию нужно так:

Добавить в прототип = сделать метод экземпляра, а если добавление в конструктор, то это статический метод.
RayTwitty
Переопределил стандартный round, чтобы указывать до какого знака округлять число
Код
Math.round = function(num, limit) {
    if (!limit)
        limit = 0

    let mul = this.pow(10, limit)
    return this.floor(num * mul + 0.5) / mul
}

Math.round(1.76521, 2)    // 1.77
Math.round(1.76521)        // 2

а потом обнаружил toFixed mellow.gif

Впрочем, пусть полежит тут, на всякий случай.

З.Ы. хотя нет, toFixed возвращает строку и дополняет ее нулями, если задано округление до бОльшего количества знаков, чем в исходном числе.
RayTwitty
Возможно кто-нибудь в курсе - какое дефолтное имя главного модуля для npm? index.js или main.js?
RayTwitty
Цитата(1001v @ 22.12.2016, 00:35) *
Добавить в прототип = сделать метод экземпляра, а если добавление в конструктор, то это статический метод.

Дело оказалось в том, что при простом добавлении в прототип, свойство становится перечисляемым. Поэтому его видно, например, при переборе через цикл for in (что интересно, в массивах length по прежнему возвращает корректный размер, даже если добавили что-то через Array.prototype, такое же поведение и с циклом for of/методом forEach).

В общем, свойства нужно добавлять через defineProperty со снятым флажком enumerable (он по умолчанию снят).
RayTwitty
Нашел почти полностью готовую функцию формата строки для js. Немного допилил, может кто-нибудь погонять на тестовых данных? На моих все нормально.

open
Код
String.prototype.format = function() {
    let i = -1

    return this.replace(/%(-)?(0?[0-9]+)?([.][0-9]+)?([#][0-9]+)?([scbfpeoxXud])/g, (exp, p0, p1, p2, p3, p4) => {
        if (exp == '%%')
            return '%'

        if (p4 == 'b')
            return arguments[++i] ? 'true' : 'false'

        if (arguments[++i]) {
            let exp = p2 && parseInt(p2.substr(1))
            let base = p3 && parseInt(p3.substr(1))
            let val
            switch (p4) {
                case 's':
                    val = arguments[i]
                    break
                case 'c':
                    val = arguments[i][0]
                    break
                case 'f':
                    val = parseFloat(arguments[i]).toFixed(exp)
                    break
                case 'p':
                    val = parseFloat(arguments[i]).toPrecision(exp)
                    break
                case 'e':
                    val = parseFloat(arguments[i]).toExponential(exp)
                    break
                case 'o':
                    val = parseInt(arguments[i]).toString(base || 8)
                    break
                case 'x':
                case 'X':
                    val = parseInt(arguments[i]).toString(base || 16)
                    if (p4 == 'X')
                        val = val.toUpperCase()
                    break
                case 'u':
                case 'd':
                    val = parseFloat(parseInt(arguments[i], base || 10).toPrecision(exp)).toFixed(0)
                    break
            }

            val = typeof val == 'object' ? JSON.stringify(val) : val.toString(base)
            let sz = parseInt(p1)
            let ch = p1 && p1[0] == '0' ? '0' : ' '

            while (val.length < sz)
                val = p0 ? val + ch : ch + val

            return val
        }
    })
}

Тесты:
CODE
console.log('%s %s'.format('This is a string', 11)) // 'This is a string 11'
console.log('Array: %s'.format(['12.3', 13.6])) // 'Array: ["12.3",13.6]'
console.log('Object: %s'.format({test: 'test', id: 12})) // 'Object: {"test":"test","id":12}'
console.log('%c'.format('Test')) // 'T'
console.log('%b %b %b %b'.format('', 0, 1, 'test')) // 'false false true true'
console.log('%5d'.format(12)) // ' 12'
console.log('%3u'.format(5)) // ' 5'
console.log('%05d'.format(12)) // '00012'
console.log('%-5d'.format(12)) // '12 '
console.log('%5.2d'.format(123)) // ' 120'
console.log('%5.2f'.format(1.1)) // ' 1.10'
console.log('%10.2e'.format(1.1)) // ' 1.10e+0'
console.log('%5.3p'.format(1.12345)) // ' 1.12'
console.log('%o'.format(12)) // '14'
console.log('%5x'.format(45054)) // ' affe'
console.log('%5X'.format(45054)) // ' AFFE'
console.log('%20#2x'.format('45054')) // ' 1010111111111110'
console.log('%6#2d'.format('111')) // ' 7'
console.log('%6#16d'.format('affe')) // ' 45054'

З.Ы. табы в codebox'е убились, убрал под спойлер :/
Shoкer
Не совсем в тему вопрос, но может тут найдутся знающие люди.
Вопрос касается векторной алгебры, в ней я увы полный нуб, правильно сформулировать для гугла тоже не получается.

Есть два нормализованных вектора: Вектор направления (vForward) и Вектор нормали (vNormal - перпендикулярен поверхности, из которой исходит, и отражает её наклон)

Мне необходимо vForward преобразовать с помощью vNormal так, чтобы он стал параллельным с поверхностью. (проскользил вдоль неё)

Для этого я использую функцию slide:

Код
    IC SelfRef slide(const Self& dir (vForward), const Self& norm (vNormal))
    {
        // non normalized
        return mad(dir, norm, -dir.dotproduct(norm));
    }

    IC SelfRef mad(const Self& p, const Self& d, T m)
    {
        x = p.x + d.x*m;
        y = p.y + d.y*m;
        z = p.z + d.z*m;
        return *this;
    }


Всё в итоге работает замечательно, но - если поверхность наклонена слишком сильно, и угол между ней и vForward острый, то итоговый вектор инвертирует своё направление (скользит вниз). Есть ли способ модифицировать функцию так, чтобы итоговый вектор скользил преимущественно в ту сторону, в которую указывал vForward?

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



(1) и (2) это то, как работает функция сейчас. (3) это то, чего я хочу добиться.
Молния в вакууме
Цитата(Shoкer @ 04.02.2017, 22:29) *
чтобы направление скольжения всегда было в "вверх" по Y-ку?

Я конечно тоже алгебру не знаю, но может как-то так?

vec.y = vec.y < 0.0 ? -vec.y : vec.y
Shoкer
Я сейчас тоже так подумал но нет - я поправил пост, там не в Y-ке дело, а в угле между vForward и поверхностью. Там вообще куча условий всплывает, если так подумать. ._. Для простоты лучше рассматривать пока случаи с картинки.
RayTwitty
Shoкer, т.е. надо чтобы вектор всегда в одну сторону направлен был (летел вверх на рисунке)? Ну тогда измерь угол между векторами и в зависимости от результата, инвертируй или нет.
abramcumner
Shoкer, случаи 1 и 2 абсолютно одинаковые: после контакта пуля сохраняет продольную составляющую(жирный черный вектор смотрит в ту же сторону, что и зеленый) и зануляет поперечную. В случае 3 продольная составляющая инвертируется(жирный черный вектор смотрит в противоположную зеленому сторону).
Ruw
Короче суть: С модема интернет раздает лучше чем с планшета?
Сейчас у меня в PC втыкнута USB антеннка, которая принимает сигнал с упомянутого планшета 4g,
но если бы я симку засунул бы в Wi-fi модем, протянул бы провод как ранее было прямо в PC, вместо USB антенки, это было бы значительно лучше? (Просто я пока не понимаю, нужно ли покупать Wi-fi модем, чтобы выжить все соки из новой симки. типа чтобы на PC был приоритет ) просто с прошлого интернета через Wi-fi модем вроде торренты лучше качались, а вот сейчас как-то непонятно.... мож в модеме антенки покруче....
Shoкer
На форуме есть люди, работавшие с LuaBind и желательно вне сталкера?
В оригинальном ЗП при вызове экспортированных функций срабатывало неявное приведение типов.

Например имея экспортированную из движка функцию:
void foo(char* pString, float fVal); - строка, число

В оригинальном ЗП её можно было вызывать из Lua любым из трёх способов:
foo ("123", 1)
foo (123, 1)
foo (nil, 1)

Все аргументы автоматически преобразовывались в нужный формат.
Сейчас я перешёл на новую версию движка, где используется более новый Lua и практически последняя версия LuaBind (версия не оригинальная, без boost-а)

Так вот там такой трюк с числом\nil вместо строки уже не срабатывает, LuaBind ругается что не может найти подходящей экспортированной функции с такими параметрами, аля "No matching overload found, candidates: void foo(pObj&, char*, float)"

При этом сам Lua поддерживает извращения навроде: local v = 100 + "25"

Мне интересно узнать, была ли эта фича с неявным преобразованием типов в LuaBind заслугой GSC или-же её просто отрезали в более новых версиях \ недо-портировали в новый движок. В оригинале используется LuaBind RC4 (~ 0.7.1)
ForserX
Цитата(Shoкer @ 13.02.2017, 22:18) *
На форуме есть люди, работавшие с LuaBind и желательно вне сталкера?
В оригинальном ЗП при вызове экспортированных функций срабатывало неявное приведение типов.

Например имея экспортированную из движка функцию:
void foo(char* pString, float fVal); - строка, число

В оригинальном ЗП её можно было вызывать из Lua любым из трёх способов:
foo ("123", 1)
foo (123, 1)
foo (nil, 1)

Все аргументы автоматически преобразовывались в нужный формат.
Сейчас я перешёл на новую версию движка, где используется более новый Lua и практически последняя версия LuaBind (версия не оригинальная, без boost-а)

Так вот там такой трюк с числом\nil вместо строки уже не срабатывает, LuaBind ругается что не может найти подходящей экспортированной функции с такими параметрами, аля "No matching overload found, candidates: void foo(pObj&, char*, float)"

При этом сам Lua поддерживает извращения навроде: local v = 100 + "25"

Мне интересно узнать, была ли эта фича с неявным преобразованием типов в LuaBind заслугой GSC или-же её просто отрезали в более новых версиях \ недо-портировали в новый движок. В оригинале используется LuaBind RC7 (~ 0.7.1)

Кхм. А можно попросить версию бинда. Выпиленный буст... OXR или сорцы Декса?
Shoкer
https://github.com/OpenXRay/luabind-deboostified
Это форк с некоторыми правками для XRay - там вверху есть ссылка на оригинал, я сейчас его пробую собрать. Просто с таким накрученными кодом мне ещё не приходилось работать.

Версию LuaBind-a я не знаю где смотреть, но скорее всего последняя (0.9 и выше), возможно без некоторых правок из сторонних репо.

Тут ещё дело в том, что в самом движке сталкера существовала некая прослойка (xrGame\script_callback_ex), сделанная практически полностью на макросах. В новом движке она тоже переделана, так что я пока не уверен где именно проблема.
ForserX
Цитата(Shoкer @ 13.02.2017, 22:43) *
https://github.com/OpenXRay/luabind-deboostified
Это форк с некоторыми правками для XRay - там вверху есть ссылка на оригинал, я сейчас его пробую собрать. Просто с таким накрученными кодом мне ещё не приходилось работать.

Версию LuaBind-a я не знаю где смотреть, но скорее всего последняя (0.9 и выше), возможно без некоторых правок из сторонних репо.

Тут ещё дело в том, что в самом движке сталкера существовала некая прослойка (xrGame\script_callback_ex), сделанная практически полностью на макросах. В новом движке она тоже переделана, так что я пока не уверен где именно проблема.

Интересно. Завтра попробую вне сталка бинд юзнуть.
1_A
Цитата(Ruw @ 13.02.2017, 13:07) *
Короче суть: С модема интернет раздает лучше чем с планшета?
Сейчас у меня в PC втыкнута USB антеннка, которая принимает сигнал с упомянутого планшета 4g,
но если бы я симку засунул бы в Wi-fi модем, протянул бы провод как ранее было прямо в PC, вместо USB антенки, это было бы значительно лучше? (Просто я пока не понимаю, нужно ли покупать Wi-fi модем, чтобы выжить все соки из новой симки. типа чтобы на PC был приоритет ) просто с прошлого интернета через Wi-fi модем вроде торренты лучше качались, а вот сейчас как-то непонятно.... мож в модеме антенки покруче....

Лучше не будет думаю. *И так сойдет* хотя при чем тут коддинг правда. laugh.gif
autistic
Возникла необходимость импортировать файлы ресурсов сталкера в Maya 2017, при этом хочется чтобы процесс импорта был как можно проще и не слишком трудозатратен. Написать MEL-скрипты для импорта, по скрипту на каждую сущность - геометрия уровней, статические модели, динамические модели, трансформации объектов на уровне и т.д, кажется наиболее удачной мыслью. Но при ближайшем рассмотрении MEL эта идея кажется не такой уж удачной, сам скрипт не очень-то гибок, например нельзя распарсить произвольный двоичный файл, в скрипте отсутствуют методы смещения файлового указателя. Кто сталкивался с MEL, что посоветуете, стоит ли связываться или все-таки проще писать FBX конвертер на плюсах?

p.s. есть еще в 2017 майе вариант на питоне написать скрипт, кто-нибудь пробовал, как ощущения?
Trollz0r
Скриптовый плагин на питоне был бы наиболее гибким решением.
МЕЛом сейчас обычно решают небольшие задачи в пределах одного файла smile.gif он для того и создан вообще-то, чтобы даже непрограммисты могли что-то набыдлокодить, не влезая в дебри погромирования.

А вообще в последних версиях можно даже на сисярпе что-то делать. Ну да ты ж тут погромист, сам смотри.

ЗЫ майку 2017 не используй, это самый забагованный релиз в истории, даже хуже 2011: в 2017 автостолопидоры тупо игнорят багрепорты. Возьми лучше 2016 и накатай сервиспак https://knowledge.autodesk.com/support/maya...ice-pack-6.html

RayTwitty
Есть ли способ в C++/CLI (Windows Form приложение) в label закрасить часть текста другим цветом?
Код
// на примере HTML
Тесто<span color="red">вая</span> строка


Пока нет никаких идей, кроме как подкладывать один label под другой, но и это как-то криво будет.
Tron
Цитата(RayTwitty @ 03.05.2017, 01:00) *
Есть ли способ в C++/CLI (Windows Form приложение) в label закрасить часть текста другим цветом?
Код
// на примере HTML
Тесто<span color="red">вая</span> строка


Пока нет никаких идей, кроме как подкладывать один label под другой, но и это как-то криво будет.

Код
myLabel.ForeColor = System.Drawing.Color.Red;

http://stackoverflow.com/questions/1590609...abel-in-c-sharp
abramcumner
Цитата(Tron @ 03.05.2017, 10:37) *
Код
myLabel.ForeColor = System.Drawing.Color.Red;

http://stackoverflow.com/questions/1590609...abel-in-c-sharp

Это же закрасит весь текст в лейбле другим цветом, а нужно только часть. Тут или сделать свой OnPaint для лейбла или использовать какой-нибудь RichTextBox.
aka_sektor
Интересное видео от программиста Cluster:
видео
Tron
Цитата(abramcumner @ 03.05.2017, 10:46) *
Это же закрасит весь текст в лейбле другим цветом, а нужно только часть. Тут или сделать свой OnPaint для лейбла или использовать какой-нибудь RichTextBox.

Ааа, не обратил внимания на часть
1001v
Кто скажет, какой самый новый пхп с которым работает ipb 2.3.5?
ForserX
Время глупых вопросов:
Имеем #define и using, которые можно использовать для создания синонимов типов, которые будут расцениваться компилятором как базовый, т.е.:
Код
#define u32 unsigned int
//или же
using u32 = unsigned int;


Так вот, какой вариант будет нагружать компилятор меньше? Или равноценно? Вариант с using мне больше нравится.
Молния в вакууме
Forser, typedef же.
ForserX
Цитата(saas @ 10.06.2017, 22:13) *
Forser, typedef же.

Тайпдеф создаёт синонимичный тип, а не синоним(емнип). Ну, речь идёт о C++14/C++17
RayTwitty
Цитата(Forser @ 10.06.2017, 22:05) *
Время глупых вопросов:
Имеем #define и using, которые можно использовать для создания синонимов типов, которые будут расцениваться компилятором как базовый, т.е.:
Код
#define u32 unsigned int
//или же
using u32 = unsigned int;


Так вот, какой вариант будет нагружать компилятор меньше? Или равноценно? Вариант с using мне больше нравится.

http://www.cyberforum.ru/cpp-beginners/thread930323.html

Холивару уже много лет. define на уровне препроцессора, typedef и using на уровне компилятора. Я бы юзал второе, т.к. первое по сути простая замена без хоть какой-то валидации.
Cossack-HD
Из-за недостающего пробела просрал несколько часов на дебаг. Ну а чё, вылета нет, но данные найти не получается. Вывел в лог "elements.count" в куче разных мест и нашёл, где они все теряются. Регулярные выражения - это так весело! laugh.gif
https://regex101.com/, спасибо, что ты есть!
ЗЫ: ещё я косо посматривал на рекурсивную функцию, но с ней вроде всё впорядке. Осталось только проверить повторы...
1_A
Цитата(Cossack-HD @ 16.07.2017, 23:01) *
Из-за недостающего пробела просрал несколько часов на дебаг. Ну а чё, вылета нет, но данные найти не получается. Вывел в лог "elements.count" в куче разных мест и нашёл, где они все теряются. Регулярные выражения - это так весело! laugh.gif
https://regex101.com/, спасибо, что ты есть!
ЗЫ: ещё я косо посматривал на рекурсивную функцию, но с ней вроде всё впорядке. Осталось только проверить повторы...


Когда то видел видос, как кодеры GSC при дебаге бились головой об бутылку. Удачи в поисках видоса (где то в интервью, по моему связано с Na'Vi) laugh.gif
Cossack-HD
Цитата(virus_ua @ 17.07.2017, 02:52) *
Цитата(Cossack-HD @ 16.07.2017, 23:01) *
Из-за недостающего пробела просрал несколько часов на дебаг. Ну а чё, вылета нет, но данные найти не получается. Вывел в лог "elements.count" в куче разных мест и нашёл, где они все теряются. Регулярные выражения - это так весело! laugh.gif
https://regex101.com/, спасибо, что ты есть!
ЗЫ: ещё я косо посматривал на рекурсивную функцию, но с ней вроде всё впорядке. Осталось только проверить повторы...


Когда то видел видос, как кодеры GSC при дебаге бились головой об бутылку. Удачи в поисках видоса (где то в интервью, по моему связано с Na'Vi) laugh.gif

Ахаха, было бы интересно посмотреть. А я вот уже пил в пятницу, так что сегодня без пузыря wink.gif
Кстати, моя мега прога таки смогла прошерстеть сотни HTML страниц в автомагическом режиме и собрать названия аж 29753 населённых пунктов (пусть и уходит на это несколько минут). Я охреневаю! Впервые впилил рекурсивную функцию туда, где она действительно полезна.
NanoBot-AMK
Почему производители процессоров существенно завышают реальное быстродействия. Реальные тесты показывают существенно меньшие быстродействия.
https://ru.wikipedia.org/wiki/FLOPS
Вот реальный тест вычисления умножения матрицы. Реальный код из XRay, функция mul_43.
https://yadi.sk/d/vVm-Y5Fm3NBuaC
Что у меня получилось, ну во первых, сам тест может не очень корректный, но какой есть, всё равно покажет какое быстродействие.
А меня AMD Athlon II X4 640 3.01 ГГц.
FPU тест: 138 тактов
SSE тест: 56 тактов, если сделать инлайн код, то 49-50 тактов.
Далее подсчитаем сколько float операций было сделано:
36 умножений и 27 сложений float для FPU
36+27=63/138*3.01e9=1.37 ГФлопс на ядро.
А для SSE всего выполняется: 12 mulps, 9 addps что соответствует 12*4 = 48 умножений и 9*4 = 36 сложений = 84 операций float.
48+36=84/50(инлайн код)*3.01e9=5.057 ГФлопс на ядро.
Хотя полезное быстродействие немного меньше (3.7926 ГФлопс).
И всё равно реальное быстродействие существенно меньше заявленного, зависит от кода и так от компилятора, лишь хороший понимающий программист совместно с хорошим компилятором может создать код, который может выдавать быстродействие близкое к пиковому, но обычно никогда его не достигающий. А если использовать древние компиляторы(Delphi 6, 7(оптимизация для 386 или 486)) то там быстродействие ещё меньше.

ЗЫ
Кто может программку погонять, хочу узнать сколько выполняется на core i7, а так же на бульдозере и прочих экскаваторах.
SSE код может быть не оптимизирован под новые архитектуры, т.е. с более мощным конвейером.
jamakasi
Цитата(NanoBot-AMK @ 25.09.2017, 02:55) *
Почему производители процессоров существенно завышают реальное быстродействия. Реальные тесты показывают существенно меньшие быстродействия.

Потому что флопсы давно не показывают реальную картину т.к. уже лет 20 используются хитрые инструкции и оптимизации в схемотехнике. Т.е. Даже явное указание числа инструкции на асме в работе может оказаться иным. Рекомендую почитать вот это, точнее коментарии т.к. там больше полезного.
Самый хороший пример это гонка АМД и Интел, в разное время эстафена была на разной стороне. В нулевых например АМД с более низкой частотой выигрывал конкурента с более высокой частотой опять же, сильно грубо говоря по тактам. Потом картина разительно изменилась в пользу синих, сейчас например с выходом райзенов они снова лилирует(не вплане что рвут но результаты очень близки при абсолютно разной частоте) с более низкой частотой.
Другой вопрос в том что и число тактов сейчас не может гарантировать "скорость" т.к. время выполнения тоже разница. В общем в настоящее время сравнивать производительности адекватно нельзя, можно только в живую сравнить на необходимом тебе софте с конкретным железом.

ps Если так любопытно то могу нужные тесты прогнать на своей вишере 8320 без разгона и с разгоном.
Cossack-HD
NanoBot-AMK, ещё нужно учитывать особенности архитектуры - кэш (скорость, обьём, уровни), длина очереди инструкций, связка ALU и FPU блоков и прочее-прочее - как вообще SSE разбиваются на микрокод и выполняются. Вроде как, у AMD AVX в 2 раза короче, чем у Ынтолов.
Ryzen хороши за счёт виртуальных потоков, а в том-же столкире Ryzen сливает i7 2600K.
ForserX
Цитата(Cossack-HD @ 25.09.2017, 09:20) *
Ryzen

Там уже AVX2.

P.S. Стулкир на AVX вполне юзабельный.
NanoBot-AMK
Ах да, что забыл сказать, в коде SSE я использовал параллельные операции, пробовал SSE3 использовать haddps но из-за большого времени выполнения (latency) эта инструкция себя не оправдала, выполняется 6-7 тактов.
Что бы этот код портировать в исходники С++, надо постараться (само не сделается, да же лет через 20-30), но думаю это не очень сложно. Хорошую скорость может дать некоторые инструкции SSE4.2 а именно DPPS. Скалярное умножение векторов (dot product) 32/64-битных полей. Но мой процессор этих инструкций не понимает, так что обойдёмся без их.
Этим я потом когда нибудь займусь.
ForserX
Цитата(NanoBot-AMK @ 25.09.2017, 12:46) *
Что бы этот код портировать в исходники С++, надо постараться

Есть опция /arch: и тут на выбор: SSE2, SSE, AVX, AVX2
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.