Cannot get digitalWrite fast with ATTinyCore

The fastest way I know is direct port manipulation like:

void setup() {
  DDRB |= _BV(PB0);//PB0 as output
}

void loop() {
  if (PINB & _BV(PB3)) {// true if PB3 is HIGH
    PORTB |= _BV(PB0); // set output HIGH
    delay(500);
    PORTB &= ~_BV(PB0); // set output LOW
    delay(500);
  }
}

The modern attinies (MegatinyCore) have DigitalwriteFast and PinmodeFast, that compile to a single instruction, but I never heard of the old Attinies having something similar.

[EDIT]

I did a little test to see how the port manipulation compiles.

I compiled this: ( note: I did not care delay() is not working without setup and loop)

int main(void) {
  DDRB |= _BV(PB0);//PB0 as output
  while (1) {
    if (PINB & _BV(PB3)) {// true if PB3 is HIGH
      PORTB |= _BV(PB0); // set output HIGH
      delay(500);
      PORTB &= ~_BV(PB0); // set output LOW
      delay(500);
    }
  }
}

And the port manipulation lines also seem to compile to a single instruction
See lines 30: 36: and 4a: in the compile listing is below:

Disassembly of section .text:

00000000 <__vectors>:
__vectors():
   0:	0e c0       	rjmp	.+28     	; 0x1e <__ctors_end>
   2:	15 c0       	rjmp	.+42     	; 0x2e <__bad_interrupt>
   4:	14 c0       	rjmp	.+40     	; 0x2e <__bad_interrupt>
   6:	13 c0       	rjmp	.+38     	; 0x2e <__bad_interrupt>
   8:	12 c0       	rjmp	.+36     	; 0x2e <__bad_interrupt>
   a:	11 c0       	rjmp	.+34     	; 0x2e <__bad_interrupt>
   c:	10 c0       	rjmp	.+32     	; 0x2e <__bad_interrupt>
   e:	0f c0       	rjmp	.+30     	; 0x2e <__bad_interrupt>
  10:	0e c0       	rjmp	.+28     	; 0x2e <__bad_interrupt>
  12:	0d c0       	rjmp	.+26     	; 0x2e <__bad_interrupt>
  14:	0c c0       	rjmp	.+24     	; 0x2e <__bad_interrupt>
  16:	0b c0       	rjmp	.+22     	; 0x2e <__bad_interrupt>
  18:	0a c0       	rjmp	.+20     	; 0x2e <__bad_interrupt>
  1a:	09 c0       	rjmp	.+18     	; 0x2e <__bad_interrupt>
  1c:	08 c0       	rjmp	.+16     	; 0x2e <__bad_interrupt>

0000001e <__ctors_end>:
__trampolines_start():
  1e:	11 24       	eor	r1, r1
  20:	1f be       	out	0x3f, r1	; 63
  22:	cf e5       	ldi	r28, 0x5F	; 95
  24:	d1 e0       	ldi	r29, 0x01	; 1
  26:	de bf       	out	0x3e, r29	; 62
  28:	cd bf       	out	0x3d, r28	; 61
  2a:	02 d0       	rcall	.+4      	; 0x30 <main>
  2c:	19 c0       	rjmp	.+50     	; 0x60 <_exit>

0000002e <__bad_interrupt>:
__vector_1():
  2e:	e8 cf       	rjmp	.-48     	; 0x0 <__vectors>

00000030 <main>:
main():
E:\Arduino\arduino-1.8.13 - attinycore\portable\sketchbook\portmanipulationtest/portmanipulationtest.ino:2
int main(void) {
  DDRB |= _BV(PB0);//PB0 as output
  30:	b8 9a       	sbi	0x17, 0	; 23
E:\Arduino\arduino-1.8.13 - attinycore\portable\sketchbook\portmanipulationtest/portmanipulationtest.ino:4
  while (1) {
    if (PINB & _BV(PB3)) {// true if PB3 is HIGH
  32:	b3 9b       	sbis	0x16, 3	; 22
  34:	fe cf       	rjmp	.-4      	; 0x32 <main+0x2>
E:\Arduino\arduino-1.8.13 - attinycore\portable\sketchbook\portmanipulationtest/portmanipulationtest.ino:5
      PORTB |= _BV(PB0); // set output HIGH
  36:	c0 9a       	sbi	0x18, 0	; 24
_delay_ms():
e:\arduino\arduino-1.8.13 - attinycore\hardware\tools\avr\avr\include\util/delay.h:187
	#else
		//round up by default
		__ticks_dc = (uint32_t)(ceil(fabs(__tmp)));
	#endif

	__builtin_avr_delay_cycles(__ticks_dc);
  38:	2f ef       	ldi	r18, 0xFF	; 255
  3a:	84 e3       	ldi	r24, 0x34	; 52
  3c:	9c e0       	ldi	r25, 0x0C	; 12
  3e:	21 50       	subi	r18, 0x01	; 1
  40:	80 40       	sbci	r24, 0x00	; 0
  42:	90 40       	sbci	r25, 0x00	; 0
  44:	e1 f7       	brne	.-8      	; 0x3e <__SP_H__>
  46:	00 c0       	rjmp	.+0      	; 0x48 <__SREG__+0x9>
  48:	00 00       	nop
main():
E:\Arduino\arduino-1.8.13 - attinycore\portable\sketchbook\portmanipulationtest/portmanipulationtest.ino:7
      delay(500);
      PORTB &= ~_BV(PB0); // set output LOW
  4a:	c0 98       	cbi	0x18, 0	; 24
_delay_ms():
e:\arduino\arduino-1.8.13 - attinycore\hardware\tools\avr\avr\include\util/delay.h:187
  4c:	2f ef       	ldi	r18, 0xFF	; 255
  4e:	84 e3       	ldi	r24, 0x34	; 52
  50:	9c e0       	ldi	r25, 0x0C	; 12
  52:	21 50       	subi	r18, 0x01	; 1
  54:	80 40       	sbci	r24, 0x00	; 0
  56:	90 40       	sbci	r25, 0x00	; 0
  58:	e1 f7       	brne	.-8      	; 0x52 <__SREG__+0x13>
  5a:	00 c0       	rjmp	.+0      	; 0x5c <__SREG__+0x1d>
  5c:	00 00       	nop
  5e:	e9 cf       	rjmp	.-46     	; 0x32 <main+0x2>

00000060 <_exit>:
exit():
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr25/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2278
  60:	f8 94       	cli

00000062 <__stop_program>:
__stop_program():
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr25/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2280
  62:	ff cf       	rjmp	.-2      	; 0x62 <__stop_program>