Ускорение виртуальной функции звонит в gcc

Я вижу здесь пару вещей.

  1. Файл ~/home/kiran/.ssh/authorized_keys не существует в образе Docker node:8.14.0. (Это основная часть сообщения об ошибке - No such file or directory.)
  2. authorized_keys - это список открытых ключей. ssh -i нужен закрытый ключ.
  3. authorized_keys используется только для проверки входящих соединений - если новый запрос на соединение подписан секретным ключом, который соответствует одному из открытых ключей в authorized_keys, тогда соединение авторизуется. Вы не можете использовать authorized_keys для установления исходящего соединения, и здесь Pipelines пытается установить исходящее соединение.

Вам потребуется настроить закрытый ключ в Pipelines и добавить соответствующий открытый ключ к authorized_keys в удаленной системе. https://confluence.atlassian.com/bitbucket/use-ssh-keys-in-bitbucket-pipelines-847452940.html содержит некоторые инструкции.

5
задан Wayne Kao 1 April 2009 в 00:11
поделиться

7 ответов

Это иногда поучительно, чтобы рассмотреть, как Вы написали бы код в старом добром 'C', если бы Вы не имели синтаксический сахар C++ в наличии. Иногда ответ не использует непрямой вызов. См. этот ответ для примера.

1
ответ дан 18 December 2019 в 05:55
поделиться

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

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

Если вызов будет иметь рано-outs для вещей как время/флаги затем, то я буду часто использовать двухуровневый подход. Проверка встраивается с невиртуальным вызовом с определенным для класса поведением, только названным при необходимости.

Например.

class Foo
{
public:

inline void update( void )
{
  if (can_early_out)
    return;

  updateImpl();
}

protected:

virtual void updateImpl( void ) = 0;    
}; 
9
ответ дан 18 December 2019 в 05:55
поделиться

Время проводит в фактическом вызове функции, или в самой функции?

Вызов виртуальной функции заметно медленнее, чем невиртуальный вызов, потому что виртуальный вызов требует, чтобы дополнительное разыменовало. (Google для 'vtable', если Вы хотите считать все волосатые детали.)) Обновление: оказывается, что статья Wikipedia не плоха на этом.

"Заметно" здесь, тем не менее, означает несколько инструкций, Если это использует значительную часть общего вычисления включая время, проведенное в вызванной функции, которая походит на чудесное место для рассмотрения невиртуализации и встраивания.

Но в чем-то близко к 20 годам C++, я не думаю, что когда-либо видел, что действительно происходят. Я хотел бы видеть код.

6
ответ дан 18 December 2019 в 05:55
поделиться

Если виртуальный вызов действительно является узким местом, дают CRTP попытку.

6
ответ дан 18 December 2019 в 05:55
поделиться

Вы смогли, получают немного лучшую производительность от виртуального вызова путем изменения соглашения о вызовах. Старый компилятор Borland имел __ fastcall конвенция, которая передаваемые аргументы в CPU регистрируется вместо на стеке.

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

1
ответ дан 18 December 2019 в 05:55
поделиться

Знайте, что "виртуальный" и "встроенный" не противоположности - метод может быть обоими. Компилятор счастливо встроит виртуальную функцию, если он может определить тип объекта во время компиляции:

struct B {
    virtual int f() { return 42; }
};

struct D : public B {
    virtual int f() { return 43; }
};

int main(int argc, char **argv) {
    B b;
    cout << b.f() << endl;   // This call will be inlined

    D d;
    cout << d.f() << endl;   // This call will be inlined

    B& rb = rand() ? b : d;
    cout << rb.f() << endl;  // Must use virtual dispatch (i.e. NOT inlined)
    return 0;
}

[ОБНОВЛЕНИЕ: Удостоверенный rbистинный тип динамического объекта не может быть известен во время компиляции - благодаря MSalters]

Если тип объекта может быть определен во время компиляции, но функция не inlineable (например, это является большим или определяется за пределами определения класса), это назовут нефактически.

5
ответ дан 18 December 2019 в 05:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: